具有R循环的n <-1:30的矩阵的返回Collat​​z猜想

时间:2019-12-16 20:51:36

标签: r collatz

我是R的新手。这里有很多内容,其余网络都围绕编写函数来返回给定整数的Collat​​z猜想。

这样,我设法创建了一个函数:

numseq <- function(num)
{
  if(num == 1)
    return(NULL)

  if(num %% 2 == 0)
    return(num / 2)

  return(3 * num + 1)
}

seqfetch <- function(input)
{
  result <- input
  while(input != 1)
  {
    input <- numseq(input)
    result <- c(result, input)
  }
  return(result)
}

seqfetch(15)

但是我有一个向量nums<-1:30,并试图遍历它的每个元素并对它运行函数,输出每次迭代的值和每个n的值。

我的目标是:

n = 2:[1] 2 1

n = 3:[1] 3 10 5 16 8 4 2 1

...

...

...

n = 30:[1] 30 15 46 23 70 35 106 53 160 80 40 20 10 5 16 8 4 2 1

依此类推...

我对R不太了解,并尝试将整个内容包装成一个循环。我也用一列矩阵尝试了同样的事情。我收到一条错误消息,说只会使用第一个元素。

有人可以帮忙吗?还是我做错了方向?

谢谢

2 个答案:

答案 0 :(得分:1)

这是另一种方法,将numseq重写为递归函数。

numseq <- function(num) {
  if(num == 1)
    num
  else if(num %% 2 == 0)
    c(num, numseq(num / 2))
  else
    c(num, numseq(3 * num + 1))
}

现在您要做的就是

lapply(1:30, numseq)

或者,以函数的形式,

seqfetch2 <- function(input){
  lapply(input, numseq)
}

seqfetch2(1:30)

答案 1 :(得分:0)

我设法使用sapply()实现了期望的输出。 通过将函数2封装在sapply()中,如下所示:

sapply(1:30, function(input)
{
  result <- input
  while(input != 1)
  {
    input <- numseq(input)
    result <- c(result, input)   
  }
  return(result)
}
)

我实现了期望的输出:

[[1]]
[1] 1

[[2]]
[1] 2 1

[[3]]
[1]  3 10  5 16  8  4  2  1

[[4]]
[1] 4 2 1

[[5]]
[1]  5 16  8  4  2  1

[[6]]
[1]  6  3 10  5 16  8  4  2  1

[[7]]
 [1]  7 22 11 34 17 52 26 13 40 20 10  5 16  8  4  2  1

[[8]]
[1] 8 4 2 1

[[9]]
 [1]  9 28 14  7 22 11 34 17 52 26 13 40 20 10  5 16  8  4  2  1

依此类推,直到30。