以下C++程序的输出

Output of the following C++ Program

本文关键字:输出 程序 C++ 以下      更新时间:2023-10-16

嗨,我有这个基本的代码练习,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 有人可以解释一下。

它的工作原理与这个非递归翻译完全相同:

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;
}

您可以通过手动执行每个步骤来预测输出。在您的情况下,每个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

由于代码非常小,因此可以通过物理遍历程序来预测输出,也可以使用调试器单步执行。

主要 是程序的入口点;所以你应该从第一行开始是std::count<<funct(5)<<std::end1;.

输入初始参数 x 为 5 的func(int x)方法。此函数查看参数,如果 x 为 0 或 1,则分别返回 2 或 3。否则,它将递归调用自己,返回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

如果你不太熟悉编程中的递归,这个概念应该已经模糊地熟悉了。你几乎肯定遇到过 斐波那契数列,其中序列中的下一个数字是前两个数字的总和(序列的前两个数字定义为 0 和 1)。您介绍的程序与斐波那契数列非常相似,但是,它使用 2 和 3 作为前两个数字。

因此,如果将递归序列定义为a0 = 2, a1 = 3,则an = an-1 + an-2,它看起来与定义的函数非常相似。

它是递归,所以我像这样运行

函数用 5 调用

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