跳转至

递归

递归是用系统的栈结构,为函数分配空间。

优点:容易理解,代码简洁。

缺点;大量递归占内存(暂存)。

总结

  1. 暂存,向回计算。递归就是先循环执行一部分, 直到结束条件满足时,再执行下一部分。
  2. 上一部分是正着的,下一部分是反着的。
  3. 递归必须得有一个判断结束循环的标识。递归出口、边界。不用一个条件结束的话,它就是一个死循环。
  4. 任何使用递归的都可以使用循环迭代实现。

用处

  1. 数学定义是递归的

阶乘、斐波拉契数列

  1. 数据结构是递归的

链表是递归:数据域 指针域(指向自己结构)

  1. 问题是递归的

迷宫问题,兔子生兔子问题

计算阶乘

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);
}

打印结果: image.png