退出递归而不返回任何方法

时间:2017-07-21 11:08:56

标签: java recursion

我不知道标题是否正确形成但这就是我要求的

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

private static void sum(int[] arr, int index, int sum) {
    if (index == arr.length) {
        System.out.println(sum);
    }

    for (int i = index; i < arr.length; i++) {
        sum(arr, index + 1, sum + arr[index]);
    }
}

我只是不打印答案,但它打印了很多次然后我得到stackOverflow异常

5 个答案:

答案 0 :(得分:1)

只需删除for循环然后就可以了

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

private static void sum(int[] arr, int index, int sum) {
if (index == arr.length)
    System.out.println(sum);
else
    sum(arr, index + 1, sum + arr[index]);

}

答案 1 :(得分:1)

试试这个:

public class Test {
    public static void main(String[] args) {
        int[] a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
        System.out.println(sum(a, 0, 0));
    }


    private static int sum( int[] arr, int index, int result ) 
    {
        result += arr[index ];  
        if ( index + 1 <arr.length) {  
        return sum( arr, index + 1, result);
        }
        else {
            return result;
        }
    }

答案 2 :(得分:0)

它有以下错误:

  • 逻辑错误:因为您同时使用looprecursion
  • for-loop以递归方式调用private static void sum(int[] arr, int index, int sum)方法并导致stake问题。

您可以使用以下代码(请参阅here正在工作):

class Test
{
    public static void main(String[] args) {
        int[] a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
        System.out.println("In main sum is: " + sum(a, 0, 0));
    }

    private static int sum(int[] arr, int index, int sum) {
        if (index == arr.length) {
            return sum;
        }

        return sum(arr, index + 1, sum + arr[index]);
    }
}

注意:即使您的代码产生了理想的结果,但它会消耗大量的stack-memory。当我在本地计算机上运行它时,它正在调用private static int sum(int[] arr, int index, int sum)方法9864100次!!!“

答案 3 :(得分:0)

好的,首先你需要了解迭代和递归之间的区别。我不是专家,所以我不能给你一个正确的解释,但总结一下,迭代是使用whilefor循环,而递归是调用函数你是已经在,改变其中一个参数。正如我所说,不是一个很好的解释,我建议使用谷歌。

所以,你正在做的事情是在同一时间。你正在使用这样的递归:

private static void sum(int[] arr, int index, int sum) {
...
    sum(arr, index + 1, sum + arr[index]);
}

同时迭代:

for (int i = index; i < arr.length; i++) {
    sum(arr, index + 1, sum + arr[index]);
}

它可以在其他情况下有意义,但不是在这个情况下,因为两者都用来做同样的事情,这只是添加相同数组的数字。你应该做的是:

private static void sum(int[] arr, int index, int sum) {
    if (index == arr.length) {
        System.out.println(sum);
    }
    else{
        sum(arr, index + 1, sum + arr[index]);
    }
}

这样,当index == arr.length打印结果时,执行将退出所有sum函数。如果你在那里保持for循环,它将退出该函数一次,但它将再次进入,直到循环完成,即直到i == arr.length,这是loooooooots次。

还有另一种方法可以使用int函数而不是void方法。尝试找到这样做的方法,这是练习递归的好方法。

答案 4 :(得分:0)

要回答我认为你的问题意味着什么,必须返回所有递归函数。否则它们永远不会离开函数。

我将假设您想要的最终结果是用于添加数字的递归代码。以下是您的代码的所有问题。

  1. 首先,不要在函数中使用for循环。递归用作循环的替换。使用两者就像在一个试图执行相同任务的for循环中放置一个for循环。

  2. 其次,递归函数必须有一个return语句。没有它,它将无法爆发。我不打算在这里解释递归的基础知识,但如果你愿意的话,here's a guide on how recursion works。在尝试理解我的代码之前,我建议观看这个或了解递归的概念。

  3. 这里使用递归函数的最佳方法是将sum返回到main函数,而不是在递归函数本身中打印它。在递归函数的每次迭代中,您可以返回sum + add(arr, - n,sum)的值。为此,它必须返回一个int(我不小心省略了这个,直到Shinra tensei指出它。)

  4. 不是强制性的,但请不要将您的函数(sum)命名为与重要变量相同的名称。 Java不会惩罚你,但你不会理解你自己的代码。我已将您的功能重命名为“添加”。

  5. 考虑到这一点,这里是一个简单的递归代码,用于在数组中添加数字。

    public static void main(String[] args) {
        int[] a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
        System.out.println(add(a, 0, 0)); // Receives the final value from add
    }
    
    private static int add(int[] arr, int index, int sum) {
        if (index == arr.length) {
            // You could print 'sum' here, but may as well return it to the main function and print it there.
            return (sum);
        }   
        sum += arr[index]; 
        else {
          return sum + add(arr, --n, sum);
        }
    }