2010-07-20 120 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