递归 Recursion
定义:
一个函数,直接或者间接的调用给自己
要求:
必须要有明确的中止条件
处理的数据规模在递减
转化必须是可解的
循环和递归的区别:
递归:
1、难理解
2、速度慢
3、存储空间占用大
循环
1、易理解
2、速度快
3、存储空间占用小
应用:
数和森林
数和图的算法
数学公式
死递归样例:
#include <stdio.h> #include <stdlib.h> #include <malloc.h> void funcA(int * pCounter); void funcB(int * pCounter); void funcC(int * pCounter); int main() { int counter = 1; funcA(&counter); return 0; } void funcA(int * pCounter) { ++ *pCounter; printf("funcA been called, counter is %d ", *pCounter); funcB(pCounter); } void funcB(int * pCounter) { ++ *pCounter; printf("funcB been called, counter is %d ", *pCounter); funcC(pCounter); } void funcC(int * pCounter) { ++ *pCounter; printf("funcC been called, counter is %d ", *pCounter); funcA(pCounter); }
运行结果:
counter变量设置为1,到43179时,程序结束了
也就是说函数调用最多至43178次
funcB been called, counter is 43179 Process finished with exit code -1073741571 (0xC00000FD)
案例2:
这样是直接调用自己来实现递归
#include <stdio.h> void func(int n) { if (n == 1) printf("func is end "); else func(n - 1); } int main() { func(4); return 0; }
案例3:
阶乘递归实现
#include <stdio.h> long func(long number) { if (number == 1) return 1; return func(number - 1) * number; } int main() { printf("%d ", func(12)); return 0; }
案例4:
叠加求和至100
#include <stdio.h> long sum(int number) { if (number == 1) return 1; return number + sum(number - 1); } int main() { printf("%d ", sum(150)); return 0; }
汉诺塔问题: