2015-10-29 2 views
0

Прежде всего, да, это назначение HW. Проблемы с рекурсивными факториалами в Java. Все, что я нахожу здесь и в другом месте, уже показывает, что я сделал правильно. Однако у меня возникают проблемы с дополнительным шагом. В основном мне нужен 1) Пользователь, чтобы ввести номер 2) Факториал, который должен быть рассчитан. 3) Если пользователь вводит что-либо, кроме символа или строки (а не int) для появления сообщения об ошибке. 4) Вопрос повторить до пользователь вводит «0» для выхода.Рекурсивная факториальная Java

Этапы 1 и 2 завершены. У меня проблемы с шагом 3. Кажется, я пропускаю оператор возврата, если пользователь вводит что-либо, кроме int, но я не могу точно понять, что именно.

Вот код до сих пор:

import java.util.Scanner; 

public class Recursive 
    { 
     public static void main(String[] args) 
     { 
     int number;    // To hold a number 
     char letter;   // To hold a character 


     //Create a Scanner object for keyboard input 
     Scanner keyboard = new Scanner(System.in); 

     //Get a number from the user 
     System.out.print("Enter an integer to find the factorial: "); 
     number = keyboard.nextInt(); 

     //Display the factorial 
     System.out.println(number + "! is " + factorial(number)); 
     } 

     private static int factorial(int n) 

    { 
     if (n == 0) 
      return 1;  // Base Case 
     else if (n > 0) 
      return n * factorial(n-1); 
     else (!(n>0)) 
     return 
     System.out.println(number + "is invalid"); 
     } 
    } 
+0

так окружать 'keyboard.nextInt();' с 'попробовать catch' о/и вы знаете, что они не ввели Int, если он попадает в исключение. – 3kings

+1

Поскольку это ваш HW, я не буду публиковать фактический ответ. Но дадим вам какой-то намек. Вам понадобится цикл while, который будет продолжаться вечно. Тогда if/else. Если пользователь ввел 0, то перерыв петли еще нет. Затем вы проверяете числовоеобразование с помощью пользовательского ввода с помощью блока try/catch. В блоке catch введите сообщение об ошибке. Это должно помочь вам. – user109260

+0

Мне кажется, что ваш вопрос не имеет ничего общего с факториальным расчетом и что заголовок вопроса и факториал являются просто шумом. Измените свой вопрос, чтобы уточнить, что вы на самом деле спрашиваете. – Giewev

ответ

0

После получения пользовательского ввода, прежде чем делать факторный, мы должны проверить, если входной номер или нет. Мы можем использовать шаблон. Проверьте шаблоны регулярных выражений, чтобы сделать это. После проверки, является ли это числом или нет, проверьте, равен ли он нулю, если да, используйте exit (0), чтобы выйти из программы. Если не сделать факторный

0
while (true) { 
     // Get a number from the user 
     System.out.print("Enter an integer to find the factorial: "); 
     int number = keyboard.nextInt(); 
     if (Pattern.matches("\\d+", String.valueOf(number))) { 
      if (Integer.valueOf(number) == 0) 
       System.exit(0); 

      // Display the factorial 
      System.out.println(number + "! is " + factorial(number)); 
     } 
     else 
      System.out.println("Error"); 
    } 
0

Мой ответ основан на предположении, что ваша факторный функция работает порядка properly.In, чтобы завершить шаг 3 и 4 нужно принимать ввод в цикле. В этом цикле возьмите ввод как строку и проанализируйте его в целое число, используйте try catch, чтобы вы могли поймать исключение, когда в качестве ввода задано нецелое число, и вы можете вызвать сообщение об ошибке.

public static void main(String[] args) 
    { 
    Integer number;    // To hold a number 
    String letter;   // To hold a character 

    //Create a Scanner object for keyboard input 
    Scanner keyboard = new Scanner(System.in); 

    //Get a number from the user 
    System.out.print("Enter an integer to find the factorial: "); 
    while(keyboard.hasNext()){ 

     letter = keyboard.next(); 
     try{ 
      number = Integer.parseInt(letter); 
      if(number==0){ 
        //Exiting 
        break; 
       } 
      int fact = factorial(number); 
      //Display the factorial 
      System.out.println(number + "! is " + fact); 
      System.out.print("Enter an integer to find the factorial: "); 
      } 
     catch(NumberFormatException e){ 
      System.out.println("Invalid input please enter integers only"); 
      } 
     } 
    } 

Также в вашей факториальной функции возникают проблемы с компиляцией. Вам нужно исправить это для правильной работы вашего кода.

0

Мое решение для рекурсивного факториала с использованием Java

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.math.*; 
import java.util.*; 

class Main { 
    public static String factorial(int n,String s){ 
     if(n>0){ 
      BigInteger fact = new BigInteger(s); 
      fact = fact.multiply(new BigInteger(n + "")); 
      return factorial(n-1,fact.toString()); 
     } 
     else{ 
      return s.toString(); 
     } 
    } 

    public static void main(String args[]) throws Exception { 

     BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
     String line = br.readLine(); 
      int n = Integer.parseInt(line); 
      if(n==0) 
      System.out.println("Factorial is 0"); 
      else{ 
      String s = factorial(n,"1"); 
      System.out.println("Factorial is " + s); 
      } 
    } 
} 
Смежные вопросы