1

我正在尝试编写一个简单的递归程序,它将打印出输入之前的所有整数和输入本身的规范和。例如,输入 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 我目前得到:“线程“主”java.lang.StackOverflowError 中的 5 + 44 + 33 + 22 + 11Exception ...”

4

8 回答 8

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

这具有相同的效果。

于 2013-03-31T08:34:28.097 回答
0

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

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

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

然后你会打印sum(n).

于 2013-03-31T08:34:18.133 回答
0

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

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

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

于 2013-03-31T08:34:37.710 回答
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);
    }

}
于 2013-03-31T08:35:48.423 回答
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);
}
于 2013-03-31T08:36:00.363 回答
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
于 2013-03-31T08:38:31.827 回答
0

想指出几点: 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";
    }
于 2013-03-31T08:47:21.887 回答
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;
}
于 2013-03-31T08:49:08.350 回答