You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言Collatz递归函数返回值累加原理咨询

理解Collatz递归函数的返回值累加机制

你写的递归函数核心是通过逐层累加1来统计总步数,而n==1时返回0是递归的终止条件(base case),这个0是累加的起点,不是最终的输出结果。

用具体例子拆解执行过程

拿输入n=2来说:

  1. 主函数调用collatz(2),因为2≠1且是偶数,执行return 1 + collatz(1)
  2. 进入collatz(1),触发终止条件,返回0
  3. 回到上层,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 10:03:19