2016-03-06 2 views
0

У меня есть код, который вызывает себя (java) .. когда он не получит некоторые значения.Будет ли рекурсивная функция throw StackOverflowError

public void recfunction() { 
    ---do something---- 
    if not found a then 
    call recFunction(); 
    if found a save a and then exit the function. 
} 

реквизит можно назвать не более 5 раз внутри себя. Я получаю значение «а» в 5 раз. Получу ли я StackOverflowError, если я буду запускать эту функцию 1000 раз.

Редактировать: То, что я пытаюсь спросить, это когда функция выходит ... будут ли кадры стека для всех вызовов удалены.

+0

Где код? .. Вы предоставили алгоритм. –

+0

Пожалуйста, проверьте мои изменения ... –

ответ

0

вы можете попробовать и узнать, но нет, до тех пор, пока он выполняет фактический код и остается в пределах лимита стека, он не будет. размер стека в java составляет 400 тыс., так что пока вы не отслеживаете массу вараса при каждом вызове, вы должны быть в порядке.

Если он запускается только 5 раз, прежде чем бросать stackoverflowerror, это потому, что вы превысили свой стек.

0

Конкретный ответ на ваш вопрос: «Это зависит».

Но, в общем, да, рекурсивная функция, выполняющая amok, может вызвать ошибку переполнения стека.

В частности, на Java вы можете контролировать размер стека. Таким образом, вы можете запустить JVM с меньшим или большим стеком, что, очевидно, повлияет на количество переполнения стека.

Кроме того, объем локального хранилища, который вы выделите в функции, будет способствовать. Если ваша функция не использует любой стек - просто вызывает себя и, возможно, уменьшает счетчик - вам придется использовать стек только с указателями обратных адресов и базовыми данными кадра стека.

Но если вы выделите массив из 1000 элементов в каждом стеке локального стека, то, очевидно, вы будете потреблять больше стека «за вызов», и, таким образом, вы можете переполнить стек на меньшем уровне рекурсии.

+0

Пожалуйста, проверьте мои изменения ... –

+1

Да, кадры стека будут очищены при возврате вызовов. –

0

Во-первых, этот код явно не компилируется, не говоря уже о перспективе ...

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

Самое главное, если бы вы запускали его на нескольких конфигурациях, вы могли бы найти разные ответы. См this question, например:

java -Xss4m Test 

Это позволит увеличить размер стека до четыре мегабайта.