递归函数返回值疑问:终止条件返回值为何影响最终计算结果?
递归函数返回值逻辑解析
问题代码
#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)来拆解整个调用流程:
- 调用
mult(5,4),进入else分支,执行return 5 + mult(5,3),此时需要先计算mult(5,3)的返回值; - 调用
mult(5,3),进入else分支,执行return 5 + mult(5,2),等待mult(5,2)的结果; - 调用
mult(5,2),进入else分支,执行return 5 + mult(5,1),等待mult(5,1)的结果; - 调用
mult(5,1),进入else分支,执行return 5 + mult(5,0),等待mult(5,0)的结果; - 调用
mult(5,0),触发if条件,return 0,这个0会返回给上一层的mult(5,1); - 回到
mult(5,1),计算5 + 0 =5,然后把5返回给mult(5,2); - 回到
mult(5,2),计算5 +5=10,返回给mult(5,3); - 回到
mult(5,3),计算5+10=15,返回给mult(5,4); - 回到
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
相关产品推荐
相关产品推荐

