此递归代码不提供n> 2的输出。如果我包括最后一个if条件,则该函数有效。为什么会这样?
fib <- function(n){
if(n == 0){
0
}
if(n ==1 ){
1
}
if(n == 2){
1
}
if (n > 2) {
print(n)
fib(n-1) + fib(n-2)
}
}
答案 0 :(得分:1)
默认情况下,一个函数返回该函数内部最后求值的结果。在这里,您有一堆单独的if
语句,它们都会被评估(您的函数在任何时候都不会提早返回。请观察
f <- function(a) {
-99
if (a==1) {111}
if (a==2) {22}
}
f(1)
# -- doesn't return anything --
f(2)
# [1] 22
f(3)
# -- doesn't return anything --
当'a == 1'时,该中间if
语句的计算结果为111
,但是当您运行下一个if
语句时,该值将被丢弃,就像{{1 }}之前的价值。该函数中最后一个求值的表达式是-99
,它将返回if (a==2) {22}
或返回NULL。它不会返回以前的值,因为它不知道如果没有22
语句,这些值将如何关联。
else
或者您可以将它们转换为if / else,以便仅返回一个“东西”
fib <- function(n){
if(n == 0){
return(0)
}
if(n ==1 ){
return(1)
}
if(n == 2){
return(1)
}
if (n > 2) {
print(n)
return(fib(n-1) + fib(n-2))
}
}