递归方法混淆

时间:2017-09-15 05:01:45

标签: java recursion

鉴于以下

pd.DataFrame

当我使用r.magic(3,11)时,我得到33的输出,如果我使用r.magic(2.25)我得到50的输出,有人可以解释它背后的数学,因为我可以'似乎真的有意义。

2 个答案:

答案 0 :(得分:1)

好的,这是。

首先,您需要了解递归的基础知识,例如它如何返回值以及退出条件是什么。

这是2和25的堆栈跟踪。在递归中,我们创建一个堆栈,这是2和25的堆栈.a和b的第一个调用值位于堆栈的底部。即(2,25)。你需要像这样想象它。

a  b    called from return magic(a+a,b/2) or return magic(a+a,b/2)+a
64 0
32 1    2
16 3    2
8  6    1
4 12    1
2 25    2

这里1是魔术召唤(a + a,b / 2),2是来自回归魔法(a + a,b / 2)+ a的召唤。

所以从函数返回时就是stack.If从1调用然后它只返回值,否则它将添加一个返回值。

a  b
64 0        returns 0
32 1    2   returns 32
16 3    2   returns 32+16
8 6     1   returns 32+16
4 12    1   returns 32+16
2 25    2   returns 32+16+2

So the final return statement returns 50

对于第二个调用,类似的是堆栈跟踪。

a  b
48 0        returns 0
24 1    2   returns 24
12 2    1   returns 24
6 5     2   returns 24+6
3 11    2   returns 24+6+3

So the final return statement returns 33

所以你现在可以看到结果是50和33。

如果您有任何疑问,可以发表评论。

答案 1 :(得分:1)

我想,你想要一些解释,而不是程序的步骤。这是:

return magic(a + a, b / 2)

实际上是

return magic(2 * a, b / 2)

这意味着您将其中一个数字乘以2,并将另一个数字除以2.因此,此操作不会更改数学中的结果。

  

a * b =(2 * a)*(b / 2)

但是,你在这个方法中使用整数。对偶数来说没关系。但是,如果将奇数除以2,则会丢失浮动部分,即" 0.5"。

如果b为奇数,则说b = 2 * n + 1

  

a *(2 * n + 1)=(2 * a)*((2 * n + 1)/ 2)

     

2 * a * n + a =(2 * a)*(n + 0.5)

     

2 * a * n + a = 2 * a * n + a

当你使用整数时,那将是错误的:

  

2 * a * n + a = 2 * a * n

递归地,这个额外的a变成了2a,4a,......

你可以用a的这些倍数的总和得出一个* b。

当b为0时,这就是结束,不需要加总a的任何倍数。

相关问题