我正在尝试迭代各种数字,以获得计算“链”中有多少“链接”的长度。如果它是偶数的话,我会拿一个数字并做一些事情,如果它是奇怪的话,那就继续进行直到它达到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中是否有特殊的变量赋值给这样的递归问题?
答案 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