2014-10-21 5 views
-1

Ошибка переполнения стека в методе рекурсии при попытке распечатать первые m кратных положительного целого числа n. Как это исправить? Код ниже уже логически правильно:Ошибка переполнения стека рекурсии Java

import java.util.Scanner; 
    public class Exercise3 
    { 
    public static void main (String args[]) 
    { 
    Scanner keyboard = new Scanner(System.in); 
    int n, m; 
    System.out.println("Please enter values of n and m: "); 
    n = keyboard.nextInt(); 
    m = keyboard.nextInt(); 
    // logic of code explained above 
    for(int i = (m -(m - 1)); i <= m; i++) 
    { 
    System.out.print(multiple(n * i) + ","); 
    } 

    } 
    // Now Write the Recursive method 
    public static int multiple(int n) 
    { 
    if(n == 0) 
     return 1; 
     else 
     return multiple(n); 
    } 

}

+3

Ваш рекурсивный метод не имеет условия выхода. –

+0

Собирался сказать кое-что как Юнед. Если все несколько экземпляров - это сам вызов, значит, у вас, очевидно, будет переполнение стека. – Chris

+0

Ваше редактирование не намного лучше. Для всех значений, входящих в несколько, которые не равны нулю, вы все равно закончите бесконечную рекурсию, так как параметры для функции рекурсии должны меняться при каждом вызове, иначе переполнение стека будет всегда происходить (при отсутствии внешнего состояния). – Chris

ответ

3

Это очень плохо использование рекурсии

public static int multiple(int n){ // once come into this method will never exit 
    return multiple(n); // again and again call multiple 
} 

Там нет условия выхода из этого метода рекурсии. Вам нужно подумать о состоянии выхода, чтобы прервать этот рекурсивный вызов.

Edit: для редактирования:

public static int multiple(int n) { // inside this method n is never change 
    if (n == 0) 
     return 1; 
    else 
     return multiple(n);// still no termination for the recursion call  
} 
+1

@gexcen все еще ваша рекурсия не имеет выхода. check my edit –

3

вы, вероятно, хотите сделать это:

for(int i = (m -(m - 1)); i <= m; i++) 
    { 
     System.out.print(multiple(n,i)+","); // call like this in you main method 
    } 

Это рекурсивная функция:

public static int multiple(int m,int n) { 

     if (n == 1) 
      return m; 
     else 
      return m+multiple(m,n-1); 


    } 
+1

Пожалуйста, не используйте переменную и и пре/пост-приращение или уменьшение переменной в том же самом выражении. Хотя Java определен так, что это имеет определенный результат, в C/C++ или других языках результат может зависеть от компилятора, потому что вы точно не знаете, будет ли доступ к 'n' слева от' * ' до или после его уменьшения. Это важно, потому что люди, задающие вопросы здесь, скорее всего, будут использовать другие языки в других местах своей карьеры. Это должно быть «n * multiple (n-1)», которое однозначно. – ajb

+0

Кроме того, этот метод вычисляет факториал, но я не думаю, что это то, чего хотел расспрашиватель. Я еще не понял, что он хочет. – ajb

+0

Я хочу напечатать, скажем, n равно 2, а m равно 5. Затем я печатаю первые 5 кратных 2: 2, 4, 6, 8, 10 – gexcen

0
 import java.util.Scanner; 
     public class Exercise3 
     { 
      public static void main (String args[]) 
      { 
      Scanner keyboard = new Scanner(System.in); 
      int n, m; 
      System.out.println("Please enter values of n and m: "); 
      n = keyboard.nextInt(); 
      m = keyboard.nextInt(); 
      // logic of code explained above 
      for(int i = (m -(m - 1)); i <= m; i++) 
      { 
      System.out.print(n * i + ","); 
      } 
      }  

       } 

// Использование п = 2 и m = 5, чтобы увидеть первые 5 кратных 2. Мне нужно эксурсивный метод сделать то же самое. Это итеративно

Смежные вопросы