【问题标题】:Understanding recursion in c++了解 C++ 中的递归
【发布时间】:2017-12-15 18:33:47
【问题描述】:

我想我正在理解递归背后的原理,例如堆栈式行为以及程序“溜溜球”通过函数调用返回的方式,我似乎无法弄清楚为什么某些函数返回值尽管他们这样做了,下面的代码返回 160,这是因为返回 5 起作用吗?我想我说得对,它会变成 4*2 + 8*2 + 12*2 等等。我是不过在改变我的价值观时真的很怀疑。

有人能简要解释一下哪些值被相乘了吗?

cout << mysteryFunction(20);

int mysteryFunction (int n)
{
 if(n > 2)
  {
   return mysteryFunction(n - 4)*2;
  }

   else return 5;
}

【问题讨论】:

  • 公式为:5*2^x,当x在公式中为:20/4 = 5。因此:5*2^5 = 160

标签: c++ function recursion


【解决方案1】:

如果您对实际调用堆栈感兴趣:

mysteryFunction(20):
[n > 2] -> mysteryFunction(16) * 2
           [n > 2] -> mysteryFunction(12) * 2
                      [n > 2] -> mysteryFunction(8) * 2
                                 [n > 2] -> mysteryFunction(4) * 2
                                            [n > 2] -> mysteryFunction(0) * 2
                                                       [n <= 2] -> 5
                                            5 * 2 = 10
                                 10 * 2 = 20
                      20 * 2 = 40
           40 * 2 = 80
80 * 2 = 160

更一般地说:20 = 4*5,所以5 * 2^5 = 5 * 32 = 160

【讨论】:

    【解决方案2】:
    mysteryFunction(20) => 80 * 2 = 160
    mysteryFunction(16) => 40 * 2 = 80
    mysteryFunction(12) => 20 * 2 = 40
    mysteryFunction(8) => 10 * 2 = 20
    mysteryFunction(4) => 5 * 2 = 10
    mysteryFunction(0) => 5
    

    【讨论】:

    • 谢谢,这突然很有意义。
    【解决方案3】:

    递归不是溜溜球,它只是嵌套得很深。

    在您的情况下,if 语句会导致 a) 从函数内部调用的函数,或 b) 返回值...让我们看看它正在运行...

     A- mysteryFunction(20)
     B-- mysteryFunction(16)
     C--- mysteryFunction(12)
     D---- mysteryFunction(8)
     E----- mysteryFunction(4)
     F------ mysteryFunction(0) <-- this is the first time (n > 2) is false
    

    F行是n &gt; 2第一次为假,即返回5。

    F 行被 E 行调用,E 行得到的值 (5) 乘以 2 并返回。所以 E 行返回 10。

    E 行被 D 行调用...得到的值 (10) 乘以 2 并返回,因此 D 行返回 20。

    ...等等。

    快速版本...让我们对它们进行排序以匹配它们作用于值的顺序...

     F: 5
     E: F * 2 = 10
     D: E * 2 = 20
     C: D * 2 = 40
     B: C * 2 = 80
     A: B * 2 = 160
    

    【讨论】:

    • 我知道这篇文章已经有 4 年历史了,但天哪,谢谢!在使用递归时,我无法理解返回值发生了什么,而这正是我所需要的。谢谢!!
    【解决方案4】:

    我建议你阅读维基百科上关于递归的这篇文章:http://en.wikipedia.org/wiki/Recursion 简而言之,递归函数是一个在达到基本情况之前调用自身的函数(这是关键)。如果您没有达到基本情况,您的函数将永远运行(无限循环)。对于你的函数,拿一张纸沿着它的路径选择任何数字作为例子,这是弄清楚它是如何工作的最好方法。阶乘就是一个很好的例子: 一个数字的阶乘,假设 5 是 !5 = 5 * 4 * 3 * 2 * 1 即 120。试试看,递归的原理是一样的,不管问题如何。 这是阶乘函数的示例。 Recursion in c++ Factorial Program

    【讨论】:

      【解决方案5】:

      只需浏览代码并替换值。

      mysteryFunction(20)                     -> mysteryFunction(16) * 2
      mysteryFunction(16) * 2                 -> mysteryFunction(12) * 2 * 2
      mysteryFunction(12) * 2 * 2             -> mysteryFunction(8)  * 2 * 2 * 2
      mysteryFunction(8) * 2 * 2 * 2          -> mysteryFunction(4)  * 2 * 2 * 2 * 2
      mysteryFunction(4)  * 2 * 2 * 2 * 2     -> mysteryFunction(0)  * 2 * 2 * 2 * 2 * 2
      mysteryFunction(0)  * 2 * 2 * 2 * 2 * 2 -> 5 * 2 * 2 * 2 * 2 * 2 -> 160
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-06-16
        • 1970-01-01
        • 1970-01-01
        • 2010-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多