【问题标题】:how to change code this into recursion Java? [closed]如何将代码更改为递归 Java? [关闭]
【发布时间】:2014-10-23 05:15:28
【问题描述】:
public long weightedSum(int[] a, int[] b, int n) {
    long value = 0;
    long sum = 0;

    for (int i = 0; i < a.length; i++) {
        value = a[i] * b[i];
        sum = sum + value;

    }

    return sum;
}

以两个一维整数数组和一个整数 n 作为参数,并返回两个数组的前 n 个元素的乘积之和。例如,给定以下两个一维数组:

int[] arr1 = {1, 2, 3, 4, 5};
int[] arr2 = {6, 7, 8, 9, 10};

arr1和arr2的前4个元素,即1 * 6 + 2 * 7 + 3 * 8 + 4 * 9 = 80作为结果。

【问题讨论】:

  • 到目前为止你尝试过什么?
  • 你为什么要这样做?
  • 计算第 n 对 value 并与 n-1 递归的结果相加。如果 n==0,则返回 0。 (@ScaryWombat - 因为这是一项任务?)
  • 因为我想了解循环和递归之间的区别可怕的袋熊我想知道我应该在该代码中更改什么,是的,这是一个作业
  • 这不是递归的好选择,因为算法是 N 阶的(对于大型数组,您的堆栈将溢出)。尝试处理阶乘。 (仍然是 N 阶,但考虑到 20!是您可以使用 64 位类型评估的最大数字,这限制了事情)。或者,更好的是,旋转排序算法或在有序列表上搜索。 (订购 log(N) 所以你的堆栈会很好)。如果这是一项作业,请向您的教授指出!

标签: java arrays recursion


【解决方案1】:
public static long weightedSum(int[] a, int[] b, int n) {
    if (n == 0)
        return 0;
    else
        return a[n - 1] * b[n - 1] + weightedSum(a, b, n - 1);
}

输出:

int[] arr1 = { 1, 2, 3, 4, 5 };
int[] arr2 = { 6, 7, 8, 9, 10 };

System.out.println(weightedSum(arr1, arr2, 1));  // output : 6
System.out.println(weightedSum(arr1, arr2, 2));  // output : 20
System.out.println(weightedSum(arr1, arr2, 3));  // output : 44
System.out.println(weightedSum(arr1, arr2, 4));  // output : 80
System.out.println(weightedSum(arr1, arr2, 5));  // output : 130

【讨论】:

  • 非常感谢 :) 我真的很感谢你
  • @BLACKFLAME 欢迎你 :)
【解决方案2】:

她是解决您问题的示例:

public static long recusiveWeightedSum(int [] a ,int [] b, int index)
    {
        if (index == a.length) {
            return 0;
        } else {
            return a[index] * b[index] + recusiveWeightedSum(a, b, index + 1);
        }
    }

public static void main(String[] args) {
        int[] arr1 = {1, 2, 3, 4, 5};
        int[] arr2 = {6, 7, 8, 9, 10};

        System.out.println("Sum1:" + Sample.weightedSum(arr1, arr2));
        System.out.println("Sum2:" + Sample.recusiveWeightedSum(arr1, arr2, 0));
    }

【讨论】:

  • 非常感谢 :) 我真的很感激
【解决方案3】:

这是我已经完成的一个,但你必须在第一次调用它时将 0 作为 n 传递。

public long sum(int[] a, int[] b, int n){


        while(a.length != 1){
            return sum(Arrays.copyOfRange(a, 0, a.length-1), 
                       Arrays.copyOfRange(b, 0, a.length-1),
                       a[a.length-1]*b[b.length-1] + n);
        }

        return a[0] * b[0] + n;
    }

【讨论】:

  • 欢迎您。但是,就像其他人所说的那样,您的原始解决方案更好(并且不要费心要求 n 作为参数,因为它不会被使用)
  • 罗杰先生,我会这样做的 :) 愿上帝保佑你
猜你喜欢
  • 2020-12-23
  • 2015-03-14
  • 1970-01-01
  • 2013-05-15
  • 2021-03-11
  • 2023-03-31
  • 2017-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多