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



我不知道标题是否正确,但这就是我问的

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

我只是不想打印答案,但它打印了很多次,然后 ofc 我得到堆栈溢出异常

试试这个:

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

只需删除 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. 首先,不要在函数中使用 for 循环。递归用作循环的替代品。同时使用两者就像将 for 循环放在尝试执行相同任务的 for 循环中一样。

  2. 其次,递归函数必须有一个 return 语句。没有这个,它将无法爆发。我不打算在这里解释递归的基础知识,但如果你愿意,这里有一个关于递归如何工作的指南。我建议在尝试理解我的代码之前先看一下这个或了解递归的概念。

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

  5. 不是强制性的,但请不要将您的函数(总和(命名为与重要变量相同的名称。Java不会惩罚你,但你不会理解你自己的代码。我已将您的函数重命名为"添加"。

考虑到这一点,这里有一个简单的递归代码来添加数组中的数字。

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

好的,首先你需要很好地理解迭代和递归之间的区别。我不是专家,所以我不能给你一个适当的解释,但总结一下,迭代是使用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,这是很多次。

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

它有以下错误:

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

您可以使用以下代码(请参阅此处工作(:

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次!!

相关内容

最新更新