我是R的新手。这里有很多内容,其余网络都围绕编写函数来返回给定整数的Collatz猜想。
这样,我设法创建了一个函数:
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不太了解,并尝试将整个内容包装成一个循环。我也用一列矩阵尝试了同样的事情。我收到一条错误消息,说只会使用第一个元素。
有人可以帮忙吗?还是我做错了方向?
谢谢
答案 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。