创建Padovan序列的功能

时间:2018-06-14 06:03:52

标签: r

我需要编写一个计算Padovan sequence的函数。程序必须允许输入一个表示序列长度的整数。

预期的序列是:1,1,1,2,2,3,4,5,7,9,12,16,21,28,37,49,65,86,114,151,...

padovan <- function(n){
  p <- c(1,1,1)
  p <- c(p,p[n-2]+p[n-3])
  print(p)
}
padovan(50)

3 个答案:

答案 0 :(得分:2)

这是padovan_sequence的简单函数

padovan_sequence <- function(n) {
   if (n < 1) stop("Please enter a positive number")
   p <- c(1, 1, 1)
   i = 4
   while(i <= n) {
    p <- c(p, p[i-2] + p[i-3])
    i = i +1
  }
  p[1:n]
}

padovan_sequence(50)
# [1]      1      1      1      2      2      3      4      5      7      9
#[11]     12     16     21     28     37     49     65     86    114    151
#[21]    200    265    351    465    616    816   1081   1432   1897   2513
#[31]   3329   4410   5842   7739  10252  13581  17991  23833  31572  41824
#[41]  55405  73396  97229 128801 170625 226030 299426 396655 525456 696081

padovan_sequence(1)
#[1] 1
padovan_sequence(2)
#[1] 1 1
padovan_sequence(-2)
#Error in padovan_sequence(-2) : Please enter a positive number

答案 1 :(得分:1)

以下代码返回padovan的序列,我使用for循环。

##### Option 1
padovan <- function(k){
p<-c()
p[1]<-p[2]<-p[3]<-1
if(k < 4){return(p[1:k])}else{
for(n in 4:k){p[n]<-p[n-2]+p[n-3]}}
return(p)}

padovan(50)
[1]      1      1      1      2      2      3      4      5      7      9
[11]     12     16     21     28     37     49     65     86    114    151
[21]    200    265    351    465    616    816   1081   1432   1897   2513
[31]   3329   4410   5842   7739  10252  13581  17991  23833  31572  41824
[41]  55405  73396  97229 128801 170625 226030 299426 396655 525456 696081

##### Option 2
library(Rcpp)
cppFunction('int padovanC(int x){
    if (x <= 3) return(1);
    return(padovanC(x-2) + padovanC(x-3));}')
sapply(1:50, padovanC)

答案 2 :(得分:1)

这是另一个使用Padovan序列的递归函数定义的选项:

padovan <- function(x) {
    if (x == 1 | x == 2 | x == 3) return(1);
    return(padovan(x - 2) + padovan(x - 3));
}

sapply(1:50, padovan);
# [1]      1      1      1      2      2      3      4      5      7      9
#[11]     12     16     21     28     37     49     65     86    114    151
#[21]    200    265    351    465    616    816   1081   1432   1897   2513
#[31]   3329   4410   5842   7739  10252  13581  17991  23833  31572  41824
#[41]  55405  73396  97229 128801 170625 226030 299426 396655 525456 696081

正如@Onyambu(谢谢!)指出的那样,我们可以通过定义一个完全矢量化递归函数来使其更加简洁

padovan <- function(x) ifelse(x <= 2, 1, padovan(x - 2) + padovan(x - 3))

然后用

获得前50个术语
padovan(1:50)