C语言中的递归函数
我在学校里得到了这个代码:C语言中的递归函数,c,function,recursion,C,Function,Recursion,我在学校里得到了这个代码: #include <stdio.h> main() { int unknown(int a, int b) { if (b == 1) return a; else return a + unknown(a, b - 1); } printf("Value = %i", unknown(3, 4)); } 结果是值=12。我似乎不明白为什
#include <stdio.h>
main()
{
int unknown(int a, int b)
{
if (b == 1)
return a;
else
return a + unknown(a, b - 1);
}
printf("Value = %i", unknown(3, 4));
}
结果是值=12。我似乎不明白为什么。
a=3,b=4,然后是3+4,对吗 每次将a添加到a中b次
所以,四次a被加上,这意味着4*3=12
编辑:a添加到a,b次-Dabo是使用递归加法的乘法。输出应该是12。最后,函数将返回到main
注意:虽然您在这里使用了嵌套函数及其工作方式,但C标准不允许使用。它是一个编译器扩展 关键是除非b==1,否则未知调用未知-这称为递归 为简洁起见,我将调用函数f,而不是未知函数: 一些语言通过模式匹配以更清晰的方式呈现这样的函数;假想模式匹配语言中的等价物可能是:
f(x,1) := x
f(x,y) := x + f(x,y-1)
所以
f(3,4) = 3 + f(3, 4-1)
= 3 + f(3, 3)
= 3 + ( 3 + f(3, 3-1))
= 3 + ( 3 + f(3, 2))
= 3 + ( 3 + ( 3 + f(3, 2 - 1)))
= 3 + ( 3 + ( 3 + f(3, 1)))
= 3 + ( 3 + ( 3 + (3)))
= 12
我想你的家庭作业是决定函数的名称比未知更好。一旦决定,请注意递归并不是实现该函数的最佳方式,除非您的语言对名为tail recursion optimization的特性有特定的支持。这可能是您以后要搁置的主题
另外,其他人也注意到嵌套函数在C中是不允许的,即使您的特定编译器可能会处理它们。这意味着,尽管您的程序执行以下操作:
int function1() {
int function2(int x) {
...
}
int x = function2(3);
}
。。。标准C编译器不允许这样做。通常的做法是:
int function1() {
int x = function2(3);
}
int function2(int x) {
...
}
a添加到a,b次。@Dabo谢谢,我已经更新了答案非常感谢:写下a和b的两列,并检查它们的起始值,直到得到正确的答案。这与逗号运算符有什么关系?告诉你们学校C语言中不允许使用嵌套函数。在我看来,这更像是对递归的理解不足。这个问题似乎离题了,因为它是关于初等数学的,而不是关于编程。@PaulGriffiths:我很惊讶地看到嵌套函数,甚至更惊讶地看到在我尝试它时它被编译了。显然,这是Gnu的扩展。哇,这比我想象的要复杂得多。非常感谢您抽出时间,您刚刚为我节省了a$$:注:我在使用dev-c++,我们被告知使用嵌套使代码尽可能清晰,但仅用于阅读目的
int function1() {
int function2(int x) {
...
}
int x = function2(3);
}
int function1() {
int x = function2(3);
}
int function2(int x) {
...
}