Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的递归函数_C_Function_Recursion - Fatal编程技术网

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) {
     ...
 }