理解java中点积的递归

时间:2017-05-14 15:36:46

标签: java recursion

有没有人能给我一些关于如何将此代码转换为递归的线索:

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);
    }
}

所以要做到这一点用递归做产品。

3 个答案:

答案 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]