鉴于以下
pd.DataFrame
当我使用r.magic(3,11)时,我得到33的输出,如果我使用r.magic(2.25)我得到50的输出,有人可以解释它背后的数学,因为我可以'似乎真的有意义。
答案 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的任何倍数。