Java 使用递归理解乘法

Java 使用递归理解乘法,java,recursion,Java,Recursion,我理解使用递归将两个数字相乘的代码。我不明白这是怎么回事。有人能帮我理解一下,为什么它是两个数字的乘积,而不是真正的乘法呢。我可能在递归方面真的很差,但是有人能推荐一些好的教程来练习递归吗 static int fun2(int a,int b) { int c=0; if(b==0) return 0; if(b%2==0) { c=fun2(a+a,b/2); System.out.println("even " + c

我理解使用递归将两个数字相乘的代码。我不明白这是怎么回事。有人能帮我理解一下,为什么它是两个数字的乘积,而不是真正的乘法呢。我可能在递归方面真的很差,但是有人能推荐一些好的教程来练习递归吗

static int fun2(int a,int b) {
    int c=0;
    if(b==0)
        return 0;
    if(b%2==0) {
        c=fun2(a+a,b/2);
        System.out.println("even " + c);
        return c;           
    }
    else {
        c=fun2(a+a,b/2)+a;
        System.out.println("odd: " + c);
        return c;
    }
}

乘法最终是一个指定次数的和,这就是代码所做的

下面是递归方法的调用顺序。假设我们用a=5和b=12调用这个方法

1 - fun2(5, 12) receives final return of 60 from below call
    2 - fun2(10, 6) receives return from below call 60
        3 - fun2(20, 3) receives return 60; a = 20; fun2 returned 40 from below call thus 40 + 20
            4 - fun2(40, 1) returns 40; a = 20; fun2 returned 0 from below call thus 0 + 40
                5 - fun2(80, 0) returns 0 and recursive loop breaks; a = 80
最后一个方法调用首先返回

我对你的方法做了一些修改,运行这个,你应该会得到更好的图片。请为seq参数传递1

static int fun2(int a,int b, int seq) {
    int c=0;
    if(b==0) {
        System.out.println(seq + " Last Call :: a: " + a + ", b: " + b);
        return 0;
    }
    if(b%2==0) {
        int returned = c = fun2(a+a,b/2, seq+1);
        System.out.println(seq + " EVEN :: a: " + a + ", b: " + b + ", returned " + returned);
        return c;


    }
    else {
        int returned = fun2(a+a,b/2, seq+1);
        System.out.println(seq + " ODD :: a: " + a + ", b: " + b + ", returned " + returned);
        c= returned + a;
        return c;
    }
}

为了理解递归,您可能会找到大量的递归示例,从中挑选一些。拿一个笔记本,假设一些输入值,像一棵树一样在纸上画每个调用。从最终调用开始,按调用的相反顺序写入返回值,希望您能清楚地了解递归的工作原理。

递归函数有一个或多个基本情况,用于确定何时停止递归,以及一个或多个递归情况,用于再次调用函数本身

此函数有一个基本情况,当
b==0
导致函数返回0时确定

如果
b%2==0
,则输入第一个递归大小写,这意味着如果
b
除以2,则剩下0的余数,即如果b是偶数。在这种情况下,返回值是使用
a+a
b/2
调用的函数本身

如果b不是0(基本情况),并且b不是偶数(第一个递归情况),则输入第二个递归情况,这意味着b是奇数。在这种情况下,返回值是使用
a+a
b/2
以及
a
再次调用的函数本身。但是请记住,这里的参数被声明为整数,因此由于
b
是奇数,
b/2
实际上等于
(b-1)/2

既然我们已经阐述了这些案例,我们需要探索算法本身。让我们通过一个示例案例:

Call 1: fun2(a=3, b=5)   expecting the answer 15  
b is odd -> recursive case 2, call fun2(3+3, (5-1)/2), and add 3   (*A)

    Call 2: fun2(a=6, b=2)  
    b is even -> recursive case 1, call fun2(6+6, 2/2)   (*B)

        Call 3: fun2(a=12, b=1)  
        b is odd -> recursive case 2, call fun2(12+12, (1-1)/2) and add 12   (*C)

            Call 4: fun2(a=24, b=0)  
            b is zero -> base case, return 0

        c = 0 + 12 = 12   (*C)

    c = 12   (*B)

c = 12 + 3 = 15   (*A)

希望这有助于理解该算法,以及理解应用于该算法的递归概念。

因为a*b意味着{a+a+…+a}b次递归是内部对函数的重复调用,以产生一些重复效果。由于乘法是一系列加法,因此此函数将
a
参数a添加一系列
b
次,以模拟乘法动作。