R中的RecuRsion变量没有被传递?

时间:2014-03-23 19:17:51

标签: r recursion

我正在尝试迭代各种数字,以获得计算“链”中有多少“链接”的长度。如果它是偶数的话,我会拿一个数字并做一些事情,如果它是奇怪的话,那就继续进行直到它达到1.我的代码

chainCount <- 0
chain <- function( n ){


  if(n %% 2 == 0 && n > 1){
    n <- n/2
    chainCount <- chainCount + 1
    print(chainCount)
    chain( n )

  }
  else if (n > 1){
    n <- 3*n + 1
    chainCount <- chainCount + 1
    print(chainCount)
    chain( n )

  }  

}

chain(13)

函数执行13→40→20→10→5→16→8→4→2→1。但是由于某种原因,在递归的每次迭代中,chainCount变量都不会递增,而且我已经给出< / p>

> chain(13)
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1    

当它应该给我9时,因为该过程总共有9个步骤。 R中是否有特殊的变量赋值给这样的递归问题?

3 个答案:

答案 0 :(得分:2)

您应该(小心!)使用“<<-”确保您更新全局chainCount

chainCount <- 0
chain <- function( n ){


  if(n %% 2 == 0 && n > 1){
    n <- n/2
    chainCount <<- chainCount + 1
    print(chainCount)
    chain( n )

  }
  else if (n > 1){
    n <- 3*n + 1
    chainCount <<- chainCount + 1
    print(chainCount)
    chain( n )

  }  

}

chain(13)

[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9

答案 1 :(得分:2)

这不会修改设置为0的chaincount变量,而是在函数内创建一个新的chaincount变量:

chainCount <- chainCount + 1

尝试:

chainCount <<- chainCount + 1

答案 2 :(得分:2)

如果你真的需要一个计数器,只需将它作为参数传递给函数。这避免了全局变量:

chain <- function( n, chainCount ){
  if(n %% 2 == 0 && n > 1){
    n <- n/2
    chainCount <- chainCount + 1
    print(chainCount)
    chain( n, chainCount )

  }
  else if (n > 1){
    n <- 3*n + 1
    chainCount <- chainCount + 1
    print(chainCount)
    chain( n, chainCount )
  }  
}

chain(13, 0)
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
相关问题