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