2014-02-19 131 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