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

时间:2013-03-31 08:29:18

标签: 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 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在线程中出现”主“java.lang.StackOverflowError ...”

8 个答案:

答案 0 :(得分:1)

你错过了终止条件。试试这个:

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

这具有相同的效果。

答案 1 :(得分:0)

由于您没有累积总和,因此无法计算它。最好的方法是返回它:定义一个函数求和直到n并递归调用它。

我会用伪代码给你,因为我知道你更愿意学习而不是完成你的工作:

function sum(int n) -> int {
     if x==1 : return 1
     else : return n + sum(n-1)
}

然后你会打印sum(n)

答案 2 :(得分:0)

你只需要在好的情况下递归。在这里你每次都会递归,所以你得到一个无限循环。

    else if(x > 0)
    {
        System.out.print(x + " + ");
        x--;
        sumReverse(x);
    }

注意我还删除了+ (x - 1),因为它将在下一次递归时打印出来。

答案 3 :(得分:0)

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

}

答案 4 :(得分:0)

  • 你没有停止递归。
  • 您应该在递归停止条件之后添加return
  • 另一件事是,从+ (n-1)中的字体中移除else,您应该没问题。
  • 另外,将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);
}

答案 5 :(得分:0)

public class Main {

    public static String s = "";

    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();
        String b=sumReverse(input);
        System.out.println(b);
    }

    public static String sumReverse(int n) {
        int x = n;

         if (x == 1) {
          s = "1" + s;
          return s;
        } else if (x > 0) {
           s ="+"+  Integer.toString(x) +s ;
           sumReverse(x - 1);
    }
        return s;

    }
}

输出:

Please enter an integer greater than one: 
10 
1+2+3+4+5+6+7+8+9+10

答案 6 :(得分:0)

想指出一些事情: 这个问题不是通常的递归候选者。 2.如果打算使用递归,最好的办法是将返回值保存为String,最后在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";
    }

答案 7 :(得分:0)

public static void sum(int n){
  sumReverse(n-1);
  System.out.print(n);
}

public static int sumReverse(int n){
  if(n==1){
    return n;
  }
  System.out.print(sumReverse(n-1)+"+");
  return n;
}