有没有人能给我一些关于如何将此代码转换为递归的线索:
public class arrayExample {
public static void main (String[] args) {
int[] a = {2,2,2,2};
int[] b = {2,2,2,2};
int n = a.length;
int sum = 0;
for (int i = 0; i < n; i++) {
sum += a[i] * b[i];
}
System.out.println(sum);
}
}
所以要做到这一点用递归做产品。
答案 0 :(得分:2)
你要求提示,所以我没有给你完整的解决方案。当您想以递归方式处理列表(或数组)时,概念几乎总是如此:
public int recursiveFunction(List l, int carry) {
if (l.isEmpty()) {
return carry;
}
return recursiveFunction(l.subList(1, l.size()), operation(carry, l.get(0));
}
operation
是您要对列表执行的操作。 carry
用于提供初始值(在第一次调用中)并保存中间结果。
您只需更改代码,使其使用两个数组而不是一个列表,并选择正确的操作。
答案 1 :(得分:1)
将循环转换为递归的一种简单方法是回答这两个问题:
n-1
次,如何在第n
次迭代后计算结果?第一个案例的答案产生了你的基本情况;第二个问题的答案解释了如何进行递归调用。
在您的情况下,答案如下:
sum
为零。n-1
次时,将a[n] * b[n]
添加到上一个结果。这可以转换为递归实现
static int dotProduct(int[] a, int[] b, int n) {
... // your implementation here
}
答案 2 :(得分:1)
好的,所以希望你在尝试编码之前尝试过它。
public class ArrayExample {
public static void main (String[] args) {
int[] a = {2,2,2,2};
int[] b = {2,2,2,2};
int n = a.length;
int result = recurseSum(a, b, n-1);
System.out.println(result);
}
public static int recurseSum(int[] a, int[] b, int n){
if(n == 0)
return a[0]*b[0];
else{
return (a[n] * b[n]) + recurseSum(a,b,n-1);
}
}
}
这段代码基本上在迭代中做同样的事情。
递归调用发生了4次。当n命中0时,[0] * b [0]返回到较高的呼叫。所以基本上从右到左它发生如下:
a [3] * b [3] + a [2] * b [2] + a [1] * b [1] + a [0] * b [0]