输出以下C ++程序

时间:2018-01-02 09:56:10

标签: c++ function loops math recursion

您好我已经获得了这个基本的代码练习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可以有人请解释。

4 个答案:

答案 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