您好我已经获得了这个基本的代码练习c ++程序的代码是:
#include <iostream>
#include <string>
int func(int x){
if ( x==0)
return 2;
else if ( x==1)
return 3;
else
return (func(x-1)+func(x-2));
}
int main()
{
std::cout<<func(5)<<std::endl;
return 0;
}
我编译并运行了这段代码。输出为21。
但是我不明白输出是如何产生的21可以有人请解释。
答案 0 :(得分:4)
它的工作方式与非递归式翻译完全相同:
int func_0() { return 2; }
int func_1() { return 3; }
int func_2() { return func_1() + func_0(); } // Returns 3 + 2 = 5
int func_3() { return func_2() + func_1(); } // Returns 5 + 3 = 8
int func_4() { return func_3() + func_2(); } // Returns 8 + 5 = 13
int func_5() { return func_4() + func_3(); } // Returns 13 + 8 = 21
int main()
{
std::cout << func_5() << std::endl;
}
答案 1 :(得分:3)
您可以手动执行每个步骤来预测输出。在您的情况下,每个func
调用都将如下图所示:
func(5)
+
+--+ func(4)
| +
| +--+ func(3)
| | +
| | +--+ func(2)
| | | +
| | | +--+ func(1) = 3
| | | |
| | | +--+ func(0) = 2
| | |
| | +--+ func(1) = 3
| |
| +--+ func(2)
| +
| +--+ func(1) = 3
| |
| +--+ func(0) = 2
|
+--+ func(3)
+
+--+ func(2)
| +
| +--+ func(1) = 3
| |
| +--+ func(0) = 2
|
+--+ func(1) = 3
+-----------+
21
答案 2 :(得分:2)
由于代码非常小,您可以通过物理遍历程序来预测输出,或者您可以使用调试器来逐步完成。
主要是您的计划的切入点;因此,您应该开始的第一行是std::count<<funct(5)<<std::end1;
。
输入func(int x)
方法,初始参数x为5.此函数查看参数,如果x分别为0或1,则返回2或3。否则,它会recursively自行调用,返回func(x-1)
和func(x-2)
的总和。
单步执行即可获得以下执行顺序:
func(5)
func(4)
func(3)
func(2)
func(1)
return 3
func(0)
return 2
func(1)
return 3
func(2)
func(1)
return 3
func(0)
return 2
func(3)
func(2)
func(1)
return 3
func(0)
return 2
func(1)
return 3
Which translates to -> 3 + 2 + 3 + 3 + 2 + 3 + 2 + 3 = 21
如果你对编程中的递归过于熟悉,那么这个概念应该已经模糊不清了。你几乎肯定遇到过 Fibonacci Sequence,其中序列中的下一个数字是前两个的总和(序列的前两个数字定义为0和1)。您提供的程序与Fibonacci序列非常相似,但它使用2和3作为前两个数字。
因此,如果您将递归序列定义为a0 = 2, a1 = 3
,那么an = an-1 + an-2
,它看起来与定义的函数非常相似。
答案 3 :(得分:1)
这是递归所以我像这样运行
使用5 调用func
func(4) + func(3)
func(3) + func(2) + func(2) + 3
func(2) + func(1) + func(1) + func(0) + func(1) + func(0) + 3
func(1) + func(0) + 3 + 3 + 2 + 3 + 2 + 3
2 + 3 + 16
21