目录
前言
本文紧接上文,继续来讲述关于C语言的函数相关知识点
一、函数的声明和定义
1. 函数的定义
- 函数声明函数的定义是指函数的具体实现,交待函数的功能实现。相当于我们平常创建自定义函数的步骤。
- 函数不能嵌套定义
下面就是其中一个示例的定义方法
int add(int x,int y)//加法函数
{
return x + y;
}
int sub(int x, int y)//减法函数
{
return x - y;
}
2. 函数的声明
- 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数
声明决定不了。 - 函数的声明一般出现在函数的使用之前。要满足先声明后使用。
- 函数的声明一般要放在头文件中的。
二、函数递归
1.什么是递归
程序调用自身的编程技巧称为递归( recursion)。表示一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
递归的主要思考方式在于:把大事化小
2. 递归的两个必要条件
- 存在限制条件,当满足这个限制条件的时候,递归便不再继续
- 每次递归调用之后越来越接近这个限制条件
3. 递归相关的练习
- 接受一个整形值(无符号),按照顺序打印它的每一位,例如:输入,1234,输出 1 2 3 4
我们可以联想到递归的大事化小的思想,我们要取出数字的每一位,我们就需要用%10得到,当想要整体的数字减小的时候,我们可以使用/10使得数字的整体位数减少,在这里我们就可以使用我们递归的思想,让我们的代码更简洁,并且可以顺序打印每一个值
下面给一张流程图方便大家理解
以下是相关的示例代码
#include <stdio.h>
void print(int n)
{
if (n > 9)
{
print(n / 10);
}
printf("%d ", n % 10);
}
int main()
{
int num = 1234;
print(num);
return 0;
}
三、函数的迭代
1. 什么是迭代
迭代实际上就是重复,如果只讨论我们比较熟悉的程序设计操作,迭代在程序中就表示循环。
2.递归和迭代的相对比
递归:函数递归中我们一层一层调用函数,它的优点是所需代码量少,简洁。但缺点主要有两个,一方面,大量重复的计算拖慢了程序的运行速度;另一方面,函数每一次被调用的时候都需要在栈区开辟相应的空间,当递归过深时可能会出现栈溢出。(栈区的空间已经被用完了,程序无法继续进行了)
函数:当我们使用迭代时,循环不需要大量调用函数,重复的计算会少很多,这个程序的运行速度会加快不少,只是这个程序的代码量会大很多。(下面这个程序不是很明显,但也确实更短)
3. 迭代相关的例子
- 应用迭代求斐波那契数列的第n项,斐波那契数列:1 1 2 3 5 8 13 …(规律:第一二项为1,后一项等于前两项的和)
下面直接给出代码的示例
int Fib(n)
{
int a = 1;
int b = 1;
int c = 1;
while (n>=3)//1和2的时候不适用
{
c = a + b;
a = b;//把原来的第二个数变成新计算中的第一个数
b = c;//把算出的结果变为新计算的第二个数
n--;
}
return c;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fib(n);
printf("%d", ret);
return 0;
}
另外我们可以用递归的思路也可以写出这段程序
#include<stdio.h>
int fib(int m)
{
int ret = 0;
if (m<=2)
{
ret = 1;//第一二项为1
}
else
{
ret = fib(m - 1) + fib(m - 2);//三项及三项以后,后一项等于前两项的和
}
return ret;
}
int main()
{
int n = 0;
scanf("%d", &n);
printf("%d",fib(n));
return 0;
}
但是细心的你会发现,要计算n比较大的时候会极其的浪费时间,应为这里面的fib()函数在调用的过程中会有很多的重复,所以用上面迭代的方法就比较高效率
总结
本文总结了函数中的声明定义,以及迭代递归的思想,接下来,我会尝试用汉诺塔问题和青蛙跳台阶等问题带着大家更深入了解函数中递归迭代的思想。