2010-07-20 101 views
2

讓我們假設我有一個循環Foo。遞歸追蹤

int Foo(int n) 
{ 
    if (n <= 1) 
     return 2; 
    else 
     return Foo(n-1) * Foo(n-2) * Foo (n-3); 
} 

多少通話將發生如果我叫美孚(3),並會產生什麼結果......

感謝

+2

你爲什麼不運行它,並找出? – 2010-07-20 23:14:59

+0

我需要能夠手工交易,我期待在考試中看到類似的內容:D – bubdada 2010-07-20 23:18:32

+0

7個電話:http://ideone.com/0LU9T – zengr 2010-07-20 23:30:36

回答

6

Foo(3)電話Foo(2)Foo(1)Foo(0)

Foo(1)Foo(0)立即返回。現在應用相同的邏輯Foo(2),它不會立即返回。

要得到的結果,得出這樣的樹:

  Foo(3) 
    /  |  \ 
    Foo(2) Foo(1) Foo(0) 

繼續繪製樹,直到你有立即返回(爲其第一if返回true),然後使用這些結果來計算遞歸調用樹中較高的值。

您可以使用該樹來確定進行了多少次遞歸調用。

+0

@bubdada:然後,爲了確保你明白,試用Foo(5)。記下你最終爲任何給定的輸入值調用函數的次數(即你最終調用Foo(0),Foo(1),Foo(2),Foo(3),Foo( 4)和Foo(5)?)。爲了獲得額外的信用,找出一種減少重複的方法,因爲在給定相同輸入的情況下,Foo應該返回相同的值。 – 2010-07-20 23:21:11

2

通行證1:美孚(3)

通行證2:美孚(2)*美孚(1)*美孚(0)

通行證3:美孚(1)*美孚(0)*美孚(-1)* 2 * 2

結果:2 * 2 * 2 * 2 * 2 = 32

0

美孚(3)將被調用的7倍。

0

如何:

int Foo(int n) 
{ 
    cout << "Foo(" << n << ")" << endl; 
    if (n <= 1) 
     return 2; 
    else 
     return Foo(n-1) * Foo(n-2) * Foo (n-3); 
} 
+0

我需要編寫多於20行的代碼才能在我的系統上運行。因爲我們使用的是C++的蹩腳版本,但感謝... ... – bubdada 2010-07-21 14:10:42

+0

@bubdada:你甚至不能使用'printf'? – Mau 2010-07-21 14:29:51