2014-10-01 4 views
0

// Рекурсивный метод, который принимает ваш int, печатает это количество звезд. // Я знаю, что первый оператор if не является надлежащим java-форматом, но имея nStars (n) в той же строке, что и factorial = (n-1), дает мне ошибку при компиляции.Проблемы с рекурсии. Почему этот метод компилируется, но сбой, когда я запускаю его в своем драйвере?

public class RecursiveMethods { 
    int theVal; 
    int factorial; 


    public void nStars(int n) { 

     if (n > 0) { 
      factorial = (n-1); 
      nStars(n); 
      System.out.print("*"); 
     } 
     else { 
      System.out.print("*"); 
     } 
    } 

    // recursively finds the binary of the int and prints the amount of 1s in the binary 
    public int numOnes(int x) { 

     int theVal = 0; 

      if (x == 0) { 
       theVal = theVal; 
    } 

      if (x % 2 == 1) { 
       theVal = 1 + theVal; 
       x = (x/2); 
       numOnes(x); 
    } 

      else if (x % 2 == 0) { 
       theVal = 0 + theVal; 
       x = (x/2); 
       numOnes(x); 
    } 


      return theVal; 
    } 

} 

// here is the driver (Only done for the * method haven't gotten to numOnes driver) 

import java.util.*; 

public class RecursiveDriver { 
    private static Object userInput; 
    public static void main(String[] args) { 
     RecursiveDriver rd = new RecursiveDriver(); 
     RecursiveMethods rm = new RecursiveMethods(); 


     System.out.println("How many stars do you want to see?"); 
     Scanner sc = new Scanner(System.in); 
     int n = sc.nextInt(); 
     rm.nStars(n); 

    } 

} 
+3

Какая ошибка? – CoverosGene

ответ

1

Посмотрите на этот код:

public void nStars(int n) { 
    if (n > 0) { 
     factorial = (n-1); 
     nStars(n); // <---- Look here 
     System.out.print("*"); 
    } 
    else { 
     System.out.print("*"); 
    } 
} 

Обратите внимание, что эта функция вызывает себя с теми же аргументами. Поэтому:

  • Когда вы звоните nStars(n), он вызывает nStars(n).
  • После этого звонка nStars(n) он вызывает nStars(n).
  • После этого звонка nStars(n) он вызывает nStars(n).
  • После этого звонка nStars(n) он вызывает nStars(n).
  • После этого звонка nStars(n) он вызывает nStars(n).
  • После этого звонка nStars(n) он вызывает nStars(n).
  • ...

В конце концов, вы получите переполнение стека от слишком большого количества рекурсивных активных вызовов одновременно.

вероятно Вы имели в виду, чтобы написать что-то вроде этого, вместо:

public void nStars(int n) { 
    if (n > 0) { 
     factorial = (n-1); 
     nStars(n - 1); // <---- Look here 
     System.out.print("*"); 
    } 
    else { 
     System.out.print("*"); 
    } 
} 

Теперь вы звоните nStars с аргументом n - 1, поэтому в конечном итоге вы получите вниз к основанию корпуса. Однако есть еще одна ошибка. (Я оставлю это для вас, чтобы найти в качестве упражнения, это не вызовет крушения)

Надеюсь, это поможет!

+0

Спасибо !!!!!!! –