写一个能看见过程的递归

补全 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】。

开始练习 →