r - 重复功能不会在 R 中停止
问题描述
我有兴趣创建一个可以提供 Colatz 序列长度的函数。为此,我使用重复功能来遍历序列。但是,repeat 函数似乎并没有停止计算值。
什么是 Collatz 序列
Collatz 序列接受一个数字(称为它n
)并检查它是偶数还是奇数。如果是偶数,则该数除以 2 ( n<-n/2
)。如果是奇数,则该数除以 3n+1 ( n<-(3n+1)
)。它在数字等于 1 时结束(当 n=1 时)。
最初,我认为重复功能不能仅仅因为浮动/整数问题而工作。所以我按照这里isTRUE(all.equal(...))
的建议添加了。那并没有解决问题。
我想那个错误在我的逻辑中。但是,我找不到它。
代码
colatzSeq<-function(n){
tempVar<-n
count<-1
repeat{
if(isTRUE(all.equal(tempVar%%2,0))){
tempVar<-tempVar/2
}else{
if(isTRUE(all.equal(tempVar,1))){
tempVar<-1
}else{
tempVar<-tempVar/(3*tempVar+1)
}
}
count<-count+1
if(isTRUE(all.equal(tempVar,1))){
print(count)
break
}
}
}
该代码应该按顺序返回多个项目。例如,colatzSeq(20)
应该返回 8(意味着根据 Collatz 序列将数字 20 变为 1 需要 7 次)。
如上所述,没有错误。只是无限分裂。
谢谢!
解决方案
根据https://en.wikipedia.org/wiki/Collat z_conjecture 修复问题中的定义并改进我们拥有的代码:
collatzSeq<-function(n) {
N <- n
while(n != 1) {
n <- if (n %% 2 == 0) n/2 else 3*n + 1
N <- c(N, n)
}
N
}
collatzSeq(20)
## [1] 20 10 5 16 8 4 2 1
推荐阅读
- c++ - 如何判断 SSL_read 是否已接收并处理来自单个消息的所有记录
- php - 仅将脚本应用于一级和二级类别 WooCommerce
- python - Python readline() 方法导致 UnicodeDecodeError
- python-3.x - 无法从 python3 中的 .env 文件访问数据
- reactjs - Prop 在 ReactJS 的子组件中为 null
- python - 如何查询比较字符串熊猫
- android - 使用 ContraintLayout 将图像定位到屏幕顶部
- ubuntu - 如何使用 Conda 在 Google Colab 中为 BiG-SCAPE 创建虚拟环境?
- python - 使用 ctypes 调用 argc/argv 函数
- c# - WPF - 制作进度条按钮并使其大小合适