[英]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 = 5
和b = 6
?
a
(8) 2b
,一次传递2b+1
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
合并很简单:
假设您要在纸上分析函数,我将结果粘贴为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.