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相乘。你的问题到底是什么?另见