递归¶
递归是用系统的栈结构,为函数分配空间。
优点:容易理解,代码简洁。
缺点;大量递归占内存(暂存)。
总结¶
- 暂存,向回计算。递归就是先循环执行一部分, 直到结束条件满足时,再执行下一部分。
- 上一部分是正着的,下一部分是反着的。
- 递归必须得有一个判断结束循环的标识。递归出口、边界。不用一个条件结束的话,它就是一个死循环。
- 任何使用递归的都可以使用循环迭代实现。
用处¶
- 数学定义是递归的
阶乘、斐波拉契数列
- 数据结构是递归的
链表是递归:数据域 指针域(指向自己结构)
- 问题是递归的
迷宫问题,兔子生兔子问题
计算阶乘¶
5! = 5 * 4 * 3 * 2 * 1;
n! = n * (n - 1)!;
5! = 5 * 4!; //计算5的阶乘,计算不出来,先暂存,去计算4的阶乘。
4! = 4 * 3!;//同理 先暂存
3! = 3 * 2!;
2! = 2 * 1!;
1! = 1 * 0!;
0! = 1; //到这里可以计算出来,然后再往回推。把上面暂存的计算。
//n! = n * (n-1)!;
long 阶乘(int n)
{
if (n == 0) {
return 1;
}
else {
return n * 阶乘(n - 1);
}
}
//调用
void test()
{
std::cout << 阶乘(5) << std::endl;
for (int num = 0; num < 10; num++) {
std::cout << num << "!=" << 阶乘(num) << std::endl;
}
}
递归过程:
递归就是嵌套,越来越多。
递归结束,再一层一层往回返。
先进入,再返回的过程。
递归前递归后。两个过程。
iOS¶
- (void)viewDidLoad {
[super viewDidLoad];
[self diGui:0];
}
- (void)diGui:(int)i {
i++;
NSLog(@"----%d",i);
//循环结束条件
if(i == 4) {
return;
}
NSLog(@"--递归之前的代码--i:%d--",i);
[self diGui:i];
//下面的代码 是最后一次的先执行, 第一次的最后执行。
NSLog(@"--递归之后的代码--i:%d--",i);
}
打印结果: