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
次,以模拟乘法动作。