R中的Fibonacci序列

R中的Fibonacci序列,r,R,我是一个新的R用户,编程经验非常有限,因此我的问题和糟糕的代码编写 我被分配了一个问题,我必须使用while循环来生成小于4000000的斐波那契数列(斐波那契数列的特征是前两个数之后的每个数都是前两个数的和) 接下来,我必须计算生成序列中偶数的总和 我的回答很成功,但是,我认为代码写得不是很好。我还能做得更好吗 > x <- 0 > y <- 1 > z <- 0 if (x == 0 & y == 1) { cat(x) cat(" ")

我是一个新的R用户,编程经验非常有限,因此我的问题和糟糕的代码编写

我被分配了一个问题,我必须使用while循环来生成小于4000000的斐波那契数列(斐波那契数列的特征是前两个数之后的每个数都是前两个数的和)

接下来,我必须计算生成序列中偶数的总和

我的回答很成功,但是,我认为代码写得不是很好。我还能做得更好吗

> x <- 0
> y <- 1
> z <- 0
if (x == 0 & y == 1) {
  cat(x)
  cat(" ")
  cat(y)
  cat(" ")
    while (x < 4000000 & y < 4000000) {
    x <- x + y
    cat(x)
    cat(" ")
    if (x %% 2 == 0) {
        z <- x + z
    }
    y <- x + y
    cat(y)
    cat(" ")
    if (y %% 2 == 0) {
        z <- y + z
    }
  }
}

4613732

我使用的是发现的斐波那契序列的闭合形式

fib=函数(n)轮(((5+sqrt(5))/10)*((1+sqrt(5))/2)**(1:n-1))

数字首先,没有必要将所有内容都显式打印出来

第二,在R中更惯用的方法是将斐波纳契数的向量表示出来,然后求和。如果您不知道斐波那契数的显式闭合形式,或者如果您被告知不要使用它,则使用循环创建斐波那契数列表

因此,要构造斐波那契数列表(一次两个),您可以

x <- 0
y <- 1
fib <- c()
while (x < 4000000 & y < 4000000){
  x <- x + y
  y <- x + y
  fib = c(fib, x, y)
}

为了得到结果。这将返回
4613732
,就像您的代码一样。子集运算符
[]
当您将逻辑条件放入其中时,将只输出满足逻辑条件的数字——在本例中,它们是偶数且小于4000000。

首先,
cat
带有
sep
参数。您可以执行
cat(x,y,sep=“”)
而不是使用3行代码

其次,当您调用
while(x<4000000&y<4000000)
时,请注意
y
将始终大于
x
,因为它是最后一个
x
y
的总和。。。因此,在这里检查
y<4000000
就足够了

对于while循环,您还可以使用计数器-可能更直观。不过,在R中建立索引并没有那么快

fib <- c(0, 1)
i <- 2
while (fib[i] < 4000000) {
  fib <- c(fib, fib[i-1] + fib[i])
  i <- i + 1
}

sum(fib[fib %% 2 == 0]) 

我会这样做的。首先,我定义了一个全局变量
I
,以包含斐波那契数列的前两个元素。最后,我将全局变量重新分配给它的初始值(即1)。如果我不这样做,那么当我再次调用函数
fib(0,1)
时,输出是不正确的,因为它使用最后一个值
I
调用函数。执行
return()
也很重要,以确保它不会返回
else
子句中的任何内容。如果不指定
return()
,则最终输出将是
1
,而不是斐波那契级数

请注意,序列号只到13号(
z@Terru_theTerror--这篇文章与你声称的是重复的文章无关。你链接的文章是关于获得非常大的斐波那契数的不准确结果。这篇文章在准确性方面没有问题,甚至没有试图达到接近那么大的数;他们只是在寻找对其结果的改进(已运行且准确)代码。您可以使用cat(x,“”)来减少代码中的“cat”数。
x <- 0
y <- 1
fib <- c()
while (x < 4000000 & y < 4000000){
  x <- x + y
  y <- x + y
  fib = c(fib, x, y)
}
sum(fib[fib %% 2 == 0 & fib < 4000000])
fib <- c(0, 1)
i <- 2
while (fib[i] < 4000000) {
  fib <- c(fib, fib[i-1] + fib[i])
  i <- i + 1
}

sum(fib[fib %% 2 == 0]) 
fib <- function(x, y) {
  s <- x + y
  c(s, if (s < 4000000) fib(y, s))
}

f <- fib(0, 1)
sum(f[f %% 2 == 0])
i <<- 1
fib <- function(x,y){
  z <- x+y
  if(z<14){
    if (i==1){
      i <<- i+1
      c(x,y,z,fib(y,z))
    }
    else c(z, fib(y,z))
  }
  else {
    i <<- 1
    return()
  }
}

a <- fib(0,1)
a