如何修复我的简单Java递归方法?

如何修复我的简单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

我正在尝试编写一个简单的递归程序,它将打印出输入之前所有整数和输入本身的标准和。例如,输入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 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)
    ,您应该会没事的
  • 另外,将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);
}
  • 您没有停止递归
  • 您应该在递归停止条件之后添加
    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-)
将以一种更简洁的方式完成这个任务是的,递归是一个要求,或者我只需要使用一个循环。