c语言 - 递归函数中的返回值



我有以下递归函数

#include <stdio.h>
#include <string.h>
int mult(int a, int b);
int main()
{
printf("mul: %dn", mult(5,4));
}
int mult(int a, int b){
if(b==0){
return 0;
}else{
return a +mult(a, b-1);   
}

}

在函数中有两个返回语句。据我了解,return 语句要么终止程序,要么返回 return 语句中它旁边的值。

在这里,无论最后发生什么,b 的值最终都变为零,条件 b==0 满足并返回 0 语句被执行。所以现在函数 mult 返回值应该为零。但它给出了确切的答案,即乘法。

当我更改返回值时,例如 10,这 10 被添加到答案中。 假设我给了 mult(5,4),如果 b==0 条件中的返回值为零,答案是 20 如果 b==0 条件中的返回值为 1,则答案为 21 如果 b==0 条件中的返回值为 10,则答案为 30 等等..

所以发生的事情是无论返回值是什么,否则它都会被添加到 if 语句中的返回值中。

有人可以解释为什么会发生这种情况,为什么函数返回正确的值,但它应该返回 0,因为它是执行的最后一个语句。your text

我建议你用笔和纸画出所有mult的调用。记下传递给函数调用的实际值,记下每个值将返回的内容。

这次我会展示它完成,但下次请自己做。

我们从mult(5, 4)开始。它将返回5 + mult(5, 3).

呼叫mult(5, 3)将返回5 + mult(5, 2)

呼叫mult(5, 2)将返回5 + mult(5, 1)

呼叫mult(5, 1)将返回5 + mult(5, 0)

呼叫mult(5, 0)将返回0

现在我们回到调用堆栈:

5 + mult(5, 0)5 + 0相同,5

5 + mult(5, 1)5 + 5相同,10

5 + mult(5, 2)155 + 10相同。

5 + mult(5, 3)5 + 15相同,20

所以mult(5, 4)会返回20.

最新更新