2014-01-03 2 views
-1

я получаю этот «java.lang.StackOverflowError» , когда я запускаю код , но проблема приходит, когда я поставил большое число как (7,10)java.lang.StackOverflowError? В Java

это код, который я пишу

код для Рассчитайте Ackermann Функция

public static void main(String[] args) { 
    int m, n, s; 
    Scanner maher = new Scanner(System.in); 
    System.out.println(" the code for calculate The Ackermann Function "); 
    System.out.println(" Enter first number M"); 
    m = maher.nextInt(); 
    System.out.println(" Enter Second number N"); 
    n = maher.nextInt(); 
    System.out.println("A(" + m + " , " + n + ") = " + Ack(m, n) + " \n"); 
} 
public static int Ack(int m, int n) { 
    if (m == 0) { 
     return n + 1; 
    } 
    if (m != 0 && n == 0) { 
     return Ack(m - 1, 1); 
    } 
    if (m != 0 && n != 0) { 
     return Ack(m - 1, Ack(m, n - 1)); 
    } 
    return 0; 
    // This code written by Maher Al Shammari 212542270 // KFU 
} 

Я пытаюсь изменить тип долго, но проблема не решает ,,,,

+7

Вы * сделать * понимать, что нет никакого способа, любой компьютер имеет достаточно места для хранения, что много уровней, не так ли? Говорить, что Акерманн (7,10) огромен, является массовым преуменьшением. –

+1

Это своего рода точка функции Аккермана. Создание безумных сумм рекурсии. – millimoose

ответ

2

Вы создали «Endles s "или, по крайней мере," слишком глубокой "рекурсии. В этом проблема.

Не говорить о том, что эта функция, как известно, очень быстро растет. Для этого вам понадобится BigInteger (не int, не долго). Вероятно, хотя даже BigInteger не заставит вас слишком далеко.

+1

любое предложение для его решения – Maher

+0

@Maher Да, проверьте условия завершения. Возможно, вы что-то пропустили. –

+0

Я уверен, что BigInteger не поможет; Я сомневаюсь, что Акерманн (6,6) подходит к BigInteger, а тем более к Аккерману (7,10). На самом деле, просто сделав быстрый поиск, я не думаю, что Аккерманн (4,4) тоже подходит в BigInteger. –

0

Вы можете попробовать управлять размером стека JVM. Я не уверен, что это поможет в конце, но если у вас есть машина с большой памятью, вы можете увеличить как стек, так и кучу и еще больше вывести из строя.

Размер стека по умолчанию - 384 КБ. Вы управляете им с помощью параметра -Xss в JVM. Например, -Xss512k устанавливает размер стека до 512 КБ.

+0

Это не плохая идея в общем случае, но для этого проблема в том, что число, которое пытается вычислить ОП, слишком велико; компьютер не может хранить столько цифр * периода *, а тем более иметь место для всех уровней рекурсии (нет способа сделать его итеративным) –

+0

@DennisMeng, что было бы проблемой. В конечном счете он собирается переполнять все, что связано с контейнером данных произвольной точности. Из записи в wikipedia: ее ценность быстро растет, даже для небольших входов. Например, A (4,2) является целым числом в 19 729 десятичных цифр. –

+2

Да, я тоже посмотрел на Википедию; А (4,4) имеет 2^(2^(65536)) цифр. Он настолько огромен, что * экспонент * не может уместиться нигде. –

2
  • переполнение стека означает слишком много вложенных вызовы методы.

  • Ваша логика кажется правильной, ее наверняка вызвано многими рекурсивными вызовами.

  • В любом случае, я думаю, вы должны быть счастливы увидеть результат для ACK (4, 4).

  • ACK (7, 10) - действительно? просят слишком много ... его как вызов NQueens (16): P

+0

Эта последняя точка не совсем верна; NQueens (16) намного * намного меньше проблем. –

+0

Думает @Mitesh ,,,,,,, – Maher

+0

@DennisMeng согласился .. Я думаю, что это должен быть TowerOfHanoi (16 дисков): D –

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