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

递归函数返回值疑问:终止条件返回值为何影响最终计算结果?

递归函数返回值逻辑解析

问题代码

#include <stdio.h>
#include <string.h>

int mult(int a, int b);
int main()
{
  printf("mul: %d\n", mult(5,4));
}

int mult(int a, int b){
    if(b==0){
        return 0;
    }else{
      return a +mult(a, b-1);   
    }
   
}

疑问点

该函数包含两个return语句,原本认为return语句要么终止程序,要么返回其后的值。按逻辑,最终b会变为0,触发return 0语句,函数应返回0,但实际得到正确的乘法结果。当修改终止条件的返回值时,比如改为1或10,该值会叠加到最终结果中(如mult(5,4)在返回值为1时结果为21,为10时结果为30)。为何函数最终返回的不是终止条件的返回值,而是叠加后的结果?

解答

你误解了递归中return的作用——return终止的是当前调用的函数实例,不是整个程序,而且返回的值会被上一层调用的函数接收并参与计算。

拿mult(5,4)来拆解整个调用流程:

  1. 调用mult(5,4),进入else分支,执行return 5 + mult(5,3),此时需要先计算mult(5,3)的返回值;
  2. 调用mult(5,3),进入else分支,执行return 5 + mult(5,2),等待mult(5,2)的结果;
  3. 调用mult(5,2),进入else分支,执行return 5 + mult(5,1),等待mult(5,1)的结果;
  4. 调用mult(5,1),进入else分支,执行return 5 + mult(5,0),等待mult(5,0)的结果;
  5. 调用mult(5,0),触发if条件,return 0,这个0会返回给上一层的mult(5,1);
  6. 回到mult(5,1),计算5 + 0 =5,然后把5返回给mult(5,2);
  7. 回到mult(5,2),计算5 +5=10,返回给mult(5,3);
  8. 回到mult(5,3),计算5+10=15,返回给mult(5,4);
  9. 回到mult(5,4),计算5+15=20,最后把20返回给main函数,所以输出的是20。

当你把终止条件的返回值改成1时,mult(5,0)返回1,整个计算链就变成5 + (5 + (5 + (5 +1))) =5+5+5+5+1=21,和你看到的结果一致;改成10的话就是5*4 +10=30,逻辑完全对应。

简单说,递归是一层一层调用下去,再一层一层带着返回值回来计算,最终的结果是所有上层调用叠加终止条件返回值后的总和,而不是只返回终止条件的值。


内容的提问来源于stack exchange,提问作者Rajinikanth Kala

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:05:26