根据我对C的了解,应在以下代码中执行函数fact
中的第一条return语句。而是执行函数中的最后一个return语句。代码在这里如何工作?为什么函数fact
中的第一个return语句没有执行?
数字框架:
#include <stdio.h>
int a = 2, count = 1, fact0 = 1;
int fact(int n) {
if (n == count) {
return fact0;//Only this return statement should be executed
}
fact0 = fact0 * a;
a++;
count++;
fact(n);
return 1;//But this return statement is executed , Why?
}
int main() {
int n;
setbuf(stdout, NULL);
printf("Enter the factorial number\n");
scanf("%d", &n);
printf("The factorial of the number is %d", fact(n));
return 0;
}
输出为:
Enter the factorial number
4
The factorial of the number is 1
答案 0 :(得分:4)
您有一堆嵌套的函数调用。最里面的返回来自您期望的位置,其他则来自其他return
语句。
// 1st call, in main
fact(4); // calls fact(4) with count == 2
fact(4); // calls fact(4) with count == 3
fact(4); // calls fact(4) with count == 4
return fact0; // as expected
return 1;
return 1;
答案 1 :(得分:2)
您需要学习如何调试代码。一个不错的开始就是像这样修改fact
:
int fact(int n) {
printf("a: %d count: %d fact0: %d n: %d\n", a, count, fact0, n);
if (n == count) {
printf("n is equal to count\n");
return fact0;//Only this return statement should be executed
}
fact0 = fact0 * a;
a++;
count++;
fact(n);
return 1;//But this return statement is executed , Why?
}
然后,运行将如下所示:
$ ./a.out
Enter the factorial number
4
a: 2 count: 1 fact0: 1 n: 4
a: 3 count: 2 fact0: 2 n: 4
a: 4 count: 3 fact0: 6 n: 4
a: 5 count: 4 fact0: 24 n: 4
n is equal to count
The factorial of the number is 1
这应该为正在发生的事情提供一个很好的线索。如果需要,插入更多打印语句。
答案 2 :(得分:0)
问题在于,使用4这样的值时,您需要输入一些递归级别。
所有子调用完成后,程序将继续执行并执行最后一个return语句,无论如何都会给您1。
一种可行的方法是返回事实(n),而不仅仅是调用它并删除最后一个return语句。