首页 > 解决方案 > 重复功能不会在 R 中停止

问题描述

我有兴趣创建一个可以提供 Colatz 序列长度的函数。为此,我使用重复功能来遍历序列。但是,repeat 函数似乎并没有停止计算值。

什么是 Collat​​z 序列

Collat​​z 序列接受一个数字(称为它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(意味着根据 Collat​​z 序列将数字 20 变为 1 需要 7 次)。

如上所述,没有错误。只是无限分裂。

谢谢!

标签: r

解决方案


根据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

推荐阅读