使用递归了解乘法

时间:2019-07-06 21:12:28

标签: 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);
        return c;           
    }
    else {
        c=fun2(a+a,b/2)+a;
        System.out.println("odd: " + c);
        return c;
    }
}

2 个答案:

答案 0 :(得分:0)

相乘最终是指定次数的和,即此代码正在执行的操作。

以下是您的递归方法的调用序列。假设我们用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

PS:最终方法调用首先返回

我稍微修改了您的方法,运行此方法,您应该会得到更好的画面。请为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;
    }
}

要了解递归,您可能会发现很多递归示例,请选择其中的一些。拿一个笔记本,假设一些输入值,像树一样继续在纸上画每个电话。从最终调用开始,以相反的顺序编写返回值,希望您能清楚了解递归的工作原理。

答案 1 :(得分:0)

递归函数具有一个或多个基本案例(用于确定何时停止递归)以及一个或多个递归案例(用于再次调用该函数本身)。

此函数有一个基本情况,用b==0标识,导致该函数返回0。

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

如果b不为0(基本情况),b不为偶数(第一个递归情况),则输入第二个递归情况,这意味着b为奇数。在这种情况下,返回值是使用a+ab/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)

希望这有助于理解算法,并了解应用于此算法的递归概念。