Простая рекурсивная функция создается, как показано ниже.Предотвращение ошибки переполнения бесконечной рекурсии/стека в рекурсивной функции R
power <- function(x, n) {
if(n >= 1) x * power(x, n-1)
else 1
}
При п устанавливается равным 1E4, он показывает ошибку infinite recursion
. Как следует из сообщения об ошибке, я обновил параметр параметра, и в этом случае возникает ошибка stack overflow
.
## error to run power 10000 times with defalult option
options()$expressions
#[1] 5000
power(2, 1e3)
#[1] 1.071509e+301
power(2, 1e4)
#Error: evaluation nested too deeply: infinite recursion/options(expressions=)?
#Error during wrapup: evaluation nested too deeply: infinite recursion/options(expressions=)?
## expressions parameter updated and results in stack overflow
options(expressions = 100000)
power(2, 1e4)
#Error: protect(): protection stack overflow
Scala поддерживает хвостовую рекурсию, так что stack overflow
ошибки может быть обработана и я изменил функцию немного следующим образом.
## tail recursion supported in Scala
power.rec <- function(x, n, t = 1) {
if(n < 1) t
else power.rec(x, n-1, x*t)
}
кажется, еще хуже, однако, как обновленная функция вызывает infinite recursion
ошибку при п устанавливается равным 1e3. Это обрабатывается, когда параметр параметра увеличивается, но ошибка stack overflow
возникает, когда n становится 1e4.
# turn to default and even worse
options(expressions = 5000)
power.rec(2, 1e3)
#Error: evaluation nested too deeply: infinite recursion/options(expressions=)?
#Error during wrapup: evaluation nested too deeply: infinite recursion/options(expressions=)?
# works in updated parameter
options(expressions = 100000)
power.rec(2, 1e3)
#[1] 1.071509e+301
# stack overflow error again
power.rec(2, 1e4)
#Error: protect(): protection stack overflow
Теперь мой вопрос
Как это может быть возможным, чтобы запустить этот вид функций без ошибок?
Заранее спасибо.
Спасибо за ваш ответ. Это помогает понять, когда/как применять рекурсивную функцию в R. –