什么是递归?
程序调用自身的编程技巧称为递归( recursion),递归做为一种算法在程序设计语言中广泛应用。
一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的主要思考方式在于:把大事化小
递归函数中的二个必要条件
- 递归函数必须有结束条件和递推关系
- 函数不断递归不断接近这个结束条件,直到接触到这个结束条件,值返回。
列题
1. 理解关于递归函数的原理
1. #include"stdio.h"
2. void print(int n)
3. {
4. if(n>9)//结束条件
5. {
6. print(n\10);//递推关系
7. }
8. printf("%d\n",n%10);
9. }
10. int mian()
11. int num=1234;
12. print("num");
13. return 0;`
先执行递推,当n小于9时返回1,再回推将计算并返回。由此可以看出递归函数必须有结束条件。
最终可以总结一句话就是先进后出
2. 计算n的介乘
#include <stdio.h>
int factorial(int n)
{
if (n==0 || n==1)
{
result = 1; //结束条件
}
else
{
result = factorial(n-1) * n; //递推关系
}
return result;
}
int main()
{
int n = 5;//输入数字5,计算5的阶乘
printf("%d的阶乘=%d",n,factorial(n));
return 0;
}
同样是先进后出
3. 斐波那契数列
斐波那契数列指的是这样一个数列:
0, 1, 1, 2, 3, 5, 8, 13, 21, ···
代码如下
#include"stdio.h
int fibonacci(int num)
{
if(n==1||n==2)//返回值
return 1;
else
return fibonacci(n-2)+fibonacci(n-1);//递堆关系
}
int mian()
{
int n
printf("%d",输入一个正整数n);
scanf("%d",&n);
printf( fibonacci( n ) );
}
提示:
- 许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更为清晰。
- 但是这些问题的迭代实现往往比递归实现效率更高,虽然代码的可读性稍微差些。
- 当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开