我不知道标题是否正确形成但这就是我要求的
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异常
答案 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)
它有以下错误:
loop
和recursion
。 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)
好的,首先你需要了解迭代和递归之间的区别。我不是专家,所以我不能给你一个正确的解释,但总结一下,迭代是使用while
和for
循环,而递归是调用函数你是已经在,改变其中一个参数。正如我所说,不是一个很好的解释,我建议使用谷歌。
所以,你正在做的事情是在同一时间。你正在使用这样的递归:
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)
要回答我认为你的问题意味着什么,必须返回所有递归函数。否则它们永远不会离开函数。
我将假设您想要的最终结果是用于添加数字的递归代码。以下是您的代码的所有问题。
首先,不要在函数中使用for循环。递归用作循环的替换。使用两者就像在一个试图执行相同任务的for循环中放置一个for循环。
其次,递归函数必须有一个return语句。没有它,它将无法爆发。我不打算在这里解释递归的基础知识,但如果你愿意的话,here's a guide on how recursion works。在尝试理解我的代码之前,我建议观看这个或了解递归的概念。
这里使用递归函数的最佳方法是将sum返回到main函数,而不是在递归函数本身中打印它。在递归函数的每次迭代中,您可以返回sum + add(arr, - n,sum)的值。为此,它必须返回一个int(我不小心省略了这个,直到Shinra tensei指出它。)
不是强制性的,但请不要将您的函数(sum)命名为与重要变量相同的名称。 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);
}
}