2014-02-19 104 views
-1

我得到这个代码在我校的练习:递归函数用C

#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”。我似乎无法理解为什么。 AFAIK它应该是a = 3,b = 4,然后是3 + 4,对不对?

+1

写下'a'和'b'的两列,并且通过它们的开始值来处理,直到找到正确的答案。 –

+5

这与逗号操作符有什么关系?并告诉你的学校在C中不允许嵌套函数。 –

+0

@PaulGriffiths,有点相关... http:// meta。stackexchange.com/a/66378/226150 – jonhopkins

回答

3

每次a添加到ab times

a = 3 
b = 4 

所以,四次a被添加,这意味着4 * 3 = 12

编辑:一个加入到A,B倍。 -Dabo

+0

a加了一次,b次。 – Dabo

+0

@Dabo谢谢,我已经更新了答案 –

+0

非常感谢你:) – user3328369

2

它采用递归加法乘法。输出应该是12。最后,函数会返回main

3 + 3 + 3 + 3 = 12 

注:虽然你在这里使用嵌套函数和它的工作,但它不是由C标准允许的。它是一个编译器扩展。

+0

非常感谢<3 – user3328369

8

关键就在这是,除非b == 1,unknown()unknown() - 这被称为递归

为了简便起见,我要调用的函数˚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 

我猜你的功课是决定什么功能的更好的名字比“未知”。一旦你决定,请注意,递归来实现该功能,除非你的语言有一个名为尾递归优化(这可能是你想要搁置供以后的一个主题)功能,具体支持的最佳途径。


另外,其他人已经注意到C语言中不允许嵌套函数 - 即使您的特定编译器可能会处理它们。这意味着虽然你的程序是这样的:

int function1() { 
    int function2(int x) { 
     ... 
    } 
    int x = function2(3); 
} 

......一个标准的C编译器不会允许它。正常的方法是:

int function1() { 
    int x = function2(3); 
} 

int function2(int x) { 
    ... 
} 
+0

WOW它比我想象的要复杂得多。非常感谢你的时间,你只是节省了我的$。 :) ps .:即时通讯使用dev-C++,我们被指示使用嵌套使我们的代码尽可能清晰,但仅用于阅读目的 – user3328369