C语言Collatz递归函数返回值累加原理咨询
理解Collatz递归函数的返回值累加机制
你写的递归函数核心是通过逐层累加1来统计总步数,而n==1时返回0是递归的终止条件(base case),这个0是累加的起点,不是最终的输出结果。
用具体例子拆解执行过程
拿输入n=2来说:
- 主函数调用
collatz(2),因为2≠1且是偶数,执行return 1 + collatz(1) - 进入
collatz(1),触发终止条件,返回0 - 回到上层,
1 + 0 = 1,所以collatz(2)最终返回1——对应2→1的1步,完全正确。
再看输入n=3的完整流程:
collatz(3)→ 1 + collatz(10)collatz(10)→ 1 + collatz(5)collatz(5)→ 1 + collatz(16)collatz(16)→ 1 + collatz(8)collatz(8)→ 1 + collatz(4)collatz(4)→ 1 + collatz(2)collatz(2)→ 1 + collatz(1)collatz(1)→ 返回0
从最底层往上累加:1+1+1+1+1+1+0 = 5,正好是3到1的总步数(3→10→5→16→8→4→2→1,共5步)。
为什么返回0却输出总步数?
你误以为递归会直接返回最后一步的0,但实际上递归是逐层回溯计算的:每一层的return 1 + collatz(...)都会等待内层递归的结果返回,然后把1和内层结果相加,再返回给上一层。只有当所有递归调用都完成后,最外层的collatz(n)才会把累加后的总步数返回给主函数,最终被printf打印出来。
终止条件返回0的意义是:当n已经是1时,不需要再执行任何步骤,所以用0作为累加的基准,让上层的每一步操作都能正确统计步数。
你的代码
#include <cs50.h> #include <stdio.h> int collatz(int n); int main(void) { int n = get_int("n: "); printf("Steps: %i\n", collatz(n)); return 0; } int collatz(int n) { if (n == 1) return 0; if (n % 2 == 0) return 1 + collatz(n / 2); else return 1 + collatz((n * 3) + 1); }
内容的提问来源于stack exchange,提问作者Ratthew
相关产品推荐
相关产品推荐

