Java 递归方法混淆
鉴于以下情况Java 递归方法混淆,java,recursion,Java,Recursion,鉴于以下情况 public class Recursion { public static int magic(int a, int b) { if (b == 0) { return 0; } else { if (b % 2 == 0) return magic(a + a, b / 2); else return magi
public class Recursion {
public static int magic(int a, int b) {
if (b == 0) {
return 0;
} else {
if (b % 2 == 0)
return magic(a + a, b / 2);
else
return magic(a + a, b / 2) + a;
}
}
public static void main(String[] args) {
Recursion r = new Recursion();
System.out.println(r.magic(3,11));
//System.out.println(r.magic(2,25));
}
}
当我使用r.magic(3,11)时,我得到33的输出,如果我使用r.magic(2.25)时,我得到50的输出,有人能给我解释一下它背后的数学吗,因为我似乎真的无法理解它。好的,这是它
首先,您需要了解递归的基本知识,比如它如何返回值以及退出条件是什么
这是2和25的堆栈跟踪。在递归中,我们制作一个堆栈,这是2和25的堆栈。a和b的第一个调用值位于堆栈的底部。i、 e(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。如果从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
如果您有任何疑问,可以发表评论 我想,你需要的是一些解释,而不是程序的步骤。这是:
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的倍数求和得到a*b
当b为0时,这就是终点,不需要求a的任何倍数。两个建议:1)跟踪代码中一些相当小的输入,这只需要几个递归,或者2)绘制函数并尝试查看它在做什么。好的,该方法将a和b相乘。你的问题到底是什么?另见