如何修复我的简单Java递归方法?
我正在尝试编写一个简单的递归程序,它将打印出输入之前所有整数和输入本身的标准和。例如,输入5应打印出“1+2+3+4+5”。输入必须大于零。在正确的方向上颠簸一下会很好如何修复我的简单Java递归方法?,java,recursion,stack-overflow,Java,Recursion,Stack Overflow,我正在尝试编写一个简单的递归程序,它将打印出输入之前所有整数和输入本身的标准和。例如,输入5应打印出“1+2+3+4+5”。输入必须大于零。在正确的方向上颠簸一下会很好 import java.util.Scanner; public class Quiz10 { public static void main (String[] args) { int input; System.out.println("Please enter an in
import java.util.Scanner;
public class Quiz10
{
public static void main (String[] args)
{
int input;
System.out.println("Please enter an integer greater than one: ");
Scanner scan = new Scanner(System.in);
input = scan.nextInt();
sumReverse(input);
}
public static void sumReverse(int n)
{
int x = n;
if(x == 1)
System.out.print(x);
else if(x > 0)
{
System.out.print(x + " + " + (x-1));
}
x--;
sumReverse(x);
}
}
编辑:输入为5时,我当前得到:“5+44+33+22+11线程“main”java.lang.StackOverflowerr中的异常…”由于没有累计总和,因此无法计算它。最好是返回它:定义一个函数求和到n,然后递归调用它 我将以伪代码的形式提供给您,因为我知道您更喜欢学习而不是完成工作:
function sum(int n) -> int {
if x==1 : return 1
else : return n + sum(n-1)
}
然后您将打印
sum(n)
,因为您没有累计总和,所以无法计算它。最好是返回它:定义一个函数求和到n,然后递归调用它
我将以伪代码的形式提供给您,因为我知道您更喜欢学习而不是完成工作:
function sum(int n) -> int {
if x==1 : return 1
else : return n + sum(n-1)
}
然后您将打印
sum(n)
您缺少终止条件。试试这个:
public static void sumReverse(int n)
{
if(n == 1) {
System.out.print(n);
return;
}
else if(n > 0)
{
System.out.print(n + " + " + (n-1));
} else return;
sumReverse(--n);
}
一旦n命中1或1小于或等于零,此函数将停止
另一种选择是:
public static void sumReverse(int n)
{
if(n == 1) System.out.print(n);
else if(n > 0)
{
System.out.print(n + " + " + (n-1));
sumReverse(--n);
}
}
这具有相同的效果。您缺少终止条件。试试这个:
public static void sumReverse(int n)
{
if(n == 1) {
System.out.print(n);
return;
}
else if(n > 0)
{
System.out.print(n + " + " + (n-1));
} else return;
sumReverse(--n);
}
一旦n命中1或1小于或等于零,此函数将停止
另一种选择是:
public static void sumReverse(int n)
{
if(n == 1) System.out.print(n);
else if(n > 0)
{
System.out.print(n + " + " + (n-1));
sumReverse(--n);
}
}
这也有同样的效果。只有在好的情况下才需要递归。在这里,你每次都递归,所以你得到一个无限循环
else if(x > 0)
{
System.out.print(x + " + ");
x--;
sumReverse(x);
}
注意,我还删除了
+(x-1)
,因为它将在下一次递归中打印。您只需要在好的情况下递归。在这里,你每次都递归,所以你得到一个无限循环
else if(x > 0)
{
System.out.print(x + " + ");
x--;
sumReverse(x);
}
public static void sumReverse(int n){
if(n==0)
return;
if(n == 1){
System.out.print(n);
}else if(n > 0)
{
System.out.print(n + " + ");
sumReverse(n-1);
}
}
注意,我还删除了+(x-1)
,因为它将在下一个递归中打印。public static void sumReverse(int n){
if(n==0)
return;
if(n == 1){
System.out.print(n);
}else if(n > 0)
{
System.out.print(n + " + ");
sumReverse(n-1);
}
}
return
其他
中的打印中删除+(n-1)
,您应该会没事的public static void sumReverse(int n)
{
if(n == 1) {
System.out.print(n);
return;
}
else if(n > 0)
{
System.out.print(n + " + ");
}
sumReverse(n-1);
}
- 您没有停止递归李>
- 您应该在递归停止条件之后添加
return
- 另一件事,从
中的打印中删除其他
,您应该会没事的+(n-1)
- 另外,将n分配给x是多余的。你可以直接在n上工作
public static void sumReverse(int n)
{
if(n == 1) {
System.out.print(n);
return;
}
else if(n > 0)
{
System.out.print(n + " + ");
}
sumReverse(n-1);
}
输出:
Please enter an integer greater than one:
10
1+2+3+4+5+6+7+8+9+10
输出:
Please enter an integer greater than one:
10
1+2+3+4+5+6+7+8+9+10
我想指出几点: 1.这个问题不是递归的常见候选问题。 2.如果要使用递归,最好将返回值保持为字符串,并最终在main方法中打印,如下所示。 3.声明一个新的变量x实际上是不必要的
public static void main (String[] args)
{
int input;
System.out.println("Please enter an integer greater than one: ");
Scanner scan = new Scanner(System.in);
input = scan.nextInt();
System.out.println(sumReverse(input));
}
public static String sumReverse(int n)
{
String a = "";
if(n > 1)
{
return (n + "+" + sumReverse(n-1));
}
return "1";
}
我想指出几点: 1.这个问题不是递归的常见候选问题。 2.如果要使用递归,最好将返回值保持为字符串,并最终在main方法中打印,如下所示。 3.声明一个新的变量x实际上是不必要的
public static void main (String[] args)
{
int input;
System.out.println("Please enter an integer greater than one: ");
Scanner scan = new Scanner(System.in);
input = scan.nextInt();
System.out.println(sumReverse(input));
}
public static String sumReverse(int n)
{
String a = "";
if(n > 1)
{
return (n + "+" + sumReverse(n-1));
}
return "1";
}
我假设您使用“5”作为输入,是吗?您得到的是什么输出?输入为5时,我得到“5+44+33+22+11线程“main”java.lang.StackOverflowerError中的异常”您的递归调用是非条件的,这会导致循环。我假设您使用“5”作为输入,是吗?您得到的是什么输出?输入为5时,我得到“5+44+33+22+11线程“main”java.lang.StackOverflowerError中的异常”您的递归调用是非条件的,这会导致循环。否,请参阅第二个函数以了解替代方法。此外,您可能需要删除(n-1),因为它将导致5+44效果。否,请参阅第二个函数以了解替代方法。此外,您可能需要删除(n-1),因为它将导致5+44效应。顺便问一下,递归是一种要求吗?如果不是的话,一个简单的
for(intx=n;x>0;x-)
将以更简洁的方式完成这个任务是的,递归是一个要求,或者我会使用一个循环。顺便问一下,递归是一个要求吗?如果不是的话,一个简单的for(intx=n;x>0;x-)
将以一种更简洁的方式完成这个任务是的,递归是一个要求,或者我只需要使用一个循环。