递归函数(通过笔和纸帮我理解)

时间:2014-01-13 19:23:41

标签: c++ recursion

首先,我必须说我可以在像Fibonacci这样的简单示例上使用递归函数,但我无法理解如何干这样的递归(用笔和纸解决)这个递归:

#include<iostream>
using namespace std;

int max(int a, int b)
{
    if(a>b)return a;
    return b;
}

int f(int a, int b)
{
    if(a==0)return b;
    return max( f(a-1,2*b), f(a-1,2*b+1) );
}

int main()
{ 
    cout<<f(8,0);
}

如何使用笔和纸进行此操作,例如a = 5b = 6

3 个答案:

答案 0 :(得分:3)

  1. 我们的深度始终为a(8)
  2. 每次调用自己调用2次,2b调整一次2b+1
  3. 返回两个调用的更大结果
  4. 2b + 1 > 2b只有最大通话的正确网站才有意义(2b + 1
  5. 现在让我们以数学方式进行第一次迭代:

    2 * b + 1                           = 2^1 * b + 2^0
    2 * (2^1 * b + 2^0) + 1             = 2^2 * b + 2^1 + 2^0
    2 * (2^2 * b + 2^1 + 2^0) + 1       = 2^3 * b + 2^2 + 2^1 + 2^0
    2 * (2^3 * b + 2^2 + 2^1 + 2^0) + 1 = 2^4 * b + 2^3 + 2^2 + 2^1 + 2^0
    

    正如您所看到的,背后有一个系统。因为第一次迭代b = 0,我们可以忽略左侧。因此最终的价值是:

    2^0 + 2^1 + 2^2 + 2^3 + 2^4 + 2^5 + 2^6 + 2^7
    =
    1 + 2 + 4 + 8 + 16 + 32 + 64 + 128
    = 
    255
    

    如果我们运行程序,我们得到完全相同的值

答案 1 :(得分:1)

只是提供一些信息,有些算法使用更复杂的参数,一个基本的例子是mergesort enter image description here

合并很简单:

  • 从每个阵列A和B中取两个元素。
  • 比较它们并将两个中的较小者(例如来自A)放在已排序的列表中。
  • 从A中取下一个元素并与手中的元素(来自B)进行比较。
  • 重复直到其中一个阵列耗尽。
  • 现在逐个放置非空数组的所有剩余元素。

enter image description here

Maybe you can find this doc useful

Or maybe this one

答案 2 :(得分:0)

假设您想在纸上分析功能,我会将结果粘贴到f(1,2)

f(2, 1) =
  max( f(1, 2), f(1, 3) ) =
    max (  max(f(0, 4), f(0, 5) , max(f(0, 6), f(0, 7) ) =
      max ( max(4, 5) , max(6, 7) ) =
        max (5, 7) =
          7

由您决定是否遵循计算

注意:我还假设你没有错过这里的括号:2*b+1