五、递归函数
一、递归函数
函数自己调用自己
本质:循环
可控循环的三要素:
循环控制变量,并且有初始值
循环控制变量的变化
循环停止条件
二、输出54321
2.1 for循环实现
// for 循环 #include<stdio.h> int main(void) { int i; for(i = 5; i>0; i--) { printf("%d\n",i); } return 0; }
2.2 递归实现54321
2.2.1 代码实现
// 递归函数 #include<stdio.h> void fun(int n) { if (n>0) { printf("%d\n",n); fun(n-1); printf("%d\n",n); } } int main(void) { fun(5); return 0; } // 结果 5 4 3 2 1 1 2 3 4 5
2.2.2 逻辑解释
// 上述示例的本质 void fun(5) { if (n>0) { printf("%d\n",n); // 5 void fun(4) { if (n>0) { printf("%d\n",n); // 4 void fun(3) { if (n>0) { printf("%d\n",n); // 3 void fun(2) { if (n>0) { printf("%d\n",n); // 2 void fun(1) { if (n>0) { printf("%d\n",n); // 1 fun(n-1); printf("%d\n",n); // 1 } } printf("%d\n",n); // 2 } } printf("%d\n",n); // 3 } } printf("%d\n",n); // 4 } } printf("%d\n",n); // 5 } }
三、斐波拉契函数
// f(n) = f(n-1) + f(n-2) // n=1 f(n)=1 // n=2 f(n)=1 #include<stdio.h> int fun(int n) { if(n == 1) { return 1; } else if (n == 2) { return 1; } else { return fun(n-1) + fun(n-2); } } int main(void) { int a = fun(6); printf("%d\n",a); // 8 return 0; }
四、实现阶乘
#include<stdio.h> int fun1(int n) { if (n == 1) { return 1; } else { return n*fun1(n-1); } } int main(void) { int b = fun1(5); printf("%d\n", b); return 0; }
五、递归的注意点
1. 递归层数不能太多,会stackflow
2. 递归比循环效率低
3. 递归难于阅读难于维护
4. 某些情况下,递归写法更简洁