为什么此Fibonnacci递归无法返回n> 2的答案?

时间:2019-02-04 17:53:20

标签: r recursion

此递归代码不提供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)
  }

}

1 个答案:

答案 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))
  }
}