在自己内部调用方法

时间:2017-08-04 11:14:46

标签: java loops recursion methods

我想输入一个接受1到10之间数字的输入并打印范围。

我需要检查输入是否为整数(检查),检查范围是否为0-10(检查),如果不是这些,请再次询问用户。那么,一个递归方法呢?

目前我有这个:

import java.util.Scanner; 
import java.util.InputMismatchException; 

public class FinalTest {
  public static void main (String [] args) {

    Scanner in = new Scanner(System.in);
    int k = 0;

    System.out.print("int - ");

    try {
      k = in.nextInt();
    } catch (InputMismatchException e) {
      System.out.println("ERR: Input");
      System.exit(1);
    }

    if(k <= 10 && k > 0) {
      for(int j=1; j <= k; j++) {
        System.out.println(j);
      }
    } else {
      System.out.println("ERR: Oob");
      System.exit(1);
    }
  }
}

我想替换“System.exit()”,以便重新尝试再次询问用户输入。

调用main();会产生错误。

在这种情况下如何正确调用main方法?

4 个答案:

答案 0 :(得分:1)

这里有两个选择:

  • 实际创建一个方法并调用
  • 只需使用循环

循环可以像:

boolean askForInput = true;
while ( askForInput ) {
  try {
    k = in.nextInt();
    askForInput = false;
  } catch ...
    print "not a number try again"
}

但除此之外:仍然想要将此代码放入自己的方法中。不是因为代码应该调用自己,而是出于清晰的原因。像:

public static int askForNumber(Scanner in) {
  ... code from above
  return k;
}

回答你的问题:你不想在这里使用递归。你想循环;是的,递归是实现循环的一种方法,但考虑到你想要在这里实现的要求,这简直是过度的。

并且为了记录:在创建帮助器方法时,您实际上可以将其简化为:

public static int askForNumber() {
  while ( askForInput ) {
    try ...
      return in.nextInt();
    } catch ...
    print "not a number try again"
  }
}

除此之外:您通常使用递归来计算计算任务,例如计算阶乘或斐波纳契数,...例如,请参阅here

答案 1 :(得分:1)

用于打印范围的递归方法部分:

public void printAscending(int n) {
  if (n > 0) {
     printAscending(n - 1);
     System.out.println(n);
  }
}

答案 2 :(得分:1)

我认为使用递归对于简单而且可能更昂贵的东西来说太过分了。您可以在扫描位周围添加while循环,直到输入的值有效。我还会把打印循环放在一边,不必在打印前测试条件,因为如果你离开while循环,则表示数字有效。您可以只测试-1值以退出进程。

public class FinalTest
{
    public static void main (String [] args)
    {
        Scanner in = new Scanner(System.in);
        int k = 0;

        do
        {
            System.out.print("int - ");

            try
            {
                k = in.nextInt();
            }
            catch (InputMismatchException e)
            {
                System.out.println("ERR: Input");
                System.exit(1);
            }
        }
        while(!(k>0 && k<=10) && k!=-1);

        if(k!=-1)
        {
            for(int j=1; j<=k; j++)
            {
                System.out.println(j);
            }
        }
        else
        {
            System.out.println("Bye Bye.");
        }
    }
}

答案 3 :(得分:1)

好的,我个人在需要使用递归时所做的就是为它创建一个单独的函数/方法。当我需要重新启动方法时,我只是在其中调用它。所以它会是这样的:

private void recursiveMethod() {
// do stuff . . .
if (yourCondition) {
    //continue to next piece of code
} else {
    recursiveMethod();
}

}

但是在大​​项目中,尽量远离递归,因为如果你陷入困境,它可以