繁体   English   中英

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

[英]Recursive function (help me understand it by pen and paper)

首先,我不得不说我可以在像斐波那契这样的简单示例上使用递归函数,但是我不明白如何对这种递归进行空运行(用笔和纸解决):

#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

  1. 我们一贯的深度a (8)
  2. 每次调用都会调用2次,一次传递2b ,一次传递2b+1
  3. 返回两个调用的较大结果
  4. 2b + 1 > 2b只有最大调用的正确位置才有意义( 2b + 1

现在让我们以数学方式进行第一次迭代:

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

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

只是为了提供一些信息,有些算法使用了一些更复杂的参数,一个基本的例子是mergesort 在此处输入图片说明

合并很简单:

  • 从数组A和B中取两个元素。
  • 比较它们,然后将两个中较小的一个(从A中得出)放在排序列表中。
  • 从A中获取下一个元素,并与手中的元素进行比较(来自B)。
  • 重复直到阵列之一用完。
  • 现在,将所有非空数组的所有剩余元素一一放置。

在此处输入图片说明

也许您会发现此文档有用

也许这一个

假设您要在纸上分析函数,我将结果粘贴为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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM