写一个能看见过程的递归
补全 walk:进入时把 n 记进 order,然后递归到 n-1,返回时再把 n 记一次。调用 walk(3) 之后,把 order 用 / 拼起来输出。 (本题用 g++ -std=c++17 -O0 编译。)
数一数朴素斐波那契调了几次
补全 fib,并让它每进一次函数就把 calls 加一。算 fib(6),输出 calls。 (本题用 g++ -std=c++17 -O0 编译。)
递归停不下来会怎样
C++ 里递归没有出口,一直往下调,最后会【0】。
无限递归最常见的两种原因
递归停不下来,通常是因为【0】。
出口写了却还是停不下来
第 1 步:出口:n 等于 0 时返回 第 2 步:来到 n = 5 第 3 步:来到 n = 3 第 4 步:来到 n = 1 第 5 步:来到 n = -1 第 6 步:来到 n = -3 第 7 步:一步跨过 0,再也回不来 5 4
出口写 == 0 还是 <= 0
把出口从 n == 0 改成 n <= 0,好处是【0】。
跨过出口走了多少层
下面的 down 出口是 n == 0,每次却减 2。为了不真的把栈压爆,程序加了一根「保险丝」:进了 50 次以上就强行返回。运行下面这段程序: #include <algorithm> #include <iostre
给漏了出口的递归补上出口
下面这个 fact 漏了出口——原样运行会一直递归下去,把栈压爆,程序以段错误崩溃。补上出口,然后算 5 的阶乘。 (本题用 g++ -std=c++17 -O0 编译。)
出口有了但参数没变小
下面这个递归有出口,却还是停不下来——往下递归时传的还是原来那个 n,原样运行同样会栈溢出崩溃。把它改对,然后算 5 的阶乘。 (本题用 g++ -std=c++17 -O0 编译。)
分治的三步
第 1 步:要对这 5 个数做分治 第 2 步:拆:从中间切成两半 第 3 步:每一半再往下切 第 4 步:切到只剩一个:直接得到答案 第 5 步:合:两半的结果再并回去 17 24 15 13 23 分治法的三步是【0】。