我正在理解使用递归将两个数字相乘的代码。我不明白这个流程。有人可以帮助我理解,为什么它是两个数字的乘积,而没有做任何乘法。我也许在递归方面确实很差,但是有人可以建议一些好的教程来练习递归吗?
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;
}
}
答案 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+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)
希望这有助于理解算法,并了解应用于此算法的递归概念。