斐波纳契序列和改变规则

问题描述 投票:1回答:2

我写了一个循环来计算Fibonacci序列的前10个数字。 F(0)= 0; F(1)= 1;规则:F(i)= F(i-2)+ F(i-1)

x <- c(0,1)
while (length(x) < 10) {
  position <- length(x)
  new <- x[position] + x[position-1]
  x <- c(x,new)
}
print(x)

现在我想将规则更改为:F(i)= F(i-1)-F(i-2)

x <- c(0,1)
while (length(x) < 10) {
  position <- length(x)
  new <- x[position-1] - x[position]
  x <- c(x,new)
}
print(x)

但是代码中的(小)变化不能提供正确的序列。这有更聪明的方法吗?

r fibonacci
2个回答
2
投票

如果你想要规则是F(i)=F(i-1)-F(i-2),那么它应该是

new <- x[position] - x[position-1]

另一方面,如果你打算只为一个小尺寸的矢量做这个没有区别,但是如果你打算去一个更大的数字那么你应该预先为这个对象分配内存,用一个NA矢量, Os或您喜欢的任何东西。否则,如果你使矢量随着每次迭代而增长,那么你的代码可能变得非常慢。

像这样的东西:

len <- 10
x <- rep(NA, len)
x[1] <- 0
x[2] <- 1
for (i in 3:len) {
  x[i] <- x[i-1] - x[i-2]
}

0
投票

我将做一个完整的参数函数:

 fibonacci <- function(len, x,func){

      while (length(x) < len) {
        position <- length(x)
        new <- func(x,position)
        x <- c(x,new)
      }
      x
    }

    fibo1 <- function(x,position){x[position] + x[position-1]}
    fibo2 <- function(x,position){x[position] - x[position-1]}
    fibo3 <- function(x,position){x[position-1] - x[position]}
    start <- c(0,1)
    fibonacci(10,start,fibo1)
    fibonacci(10,start,fibo2)
    fibonacci(10,start,fibo3)

或者使用@mgiormenti最佳代码:

fibonacci <- function(len, x,func){

        for (i in (length(x)+1):len) {
          x[i] <- func(x,i-1)
        }

    x
}

fibo1 <- function(x,position){x[position] + x[position-1]}
fibo2 <- function(x,position){x[position] - x[position-1]}
fibo3 <- function(x,position){x[position-1] - x[position]}
start <- c(0,1)
fibonacci(10,start,fibo1)
fibonacci(10,start,fibo2)
fibonacci(10,start,fibo3)
© www.soinside.com 2019 - 2024. All rights reserved.