我是编程的新手,我一直在尝试使用Project Euler来了解有关R的更多信息。
令我困扰的问题如下:
Fibonacci序列中的每个新术语都是通过添加前两个术语生成的。从1和2开始,前10个术语将是:
1,2,3,5,8,13,21,34,55,89
通过考虑Fibonacci序列中的值不超过4百万的项,找到偶数值项的总和。
我已经开始通过设置序列中的前几个数字来解决这个问题:
num <- c(1, 2)
接下来我尝试创建一个函数fib()
,它将num
中的最后两个数字相加并将它们附加到矢量。
我的第一次尝试是做以下事情:
num <- c(1, 2)
fib <- function(x) {
sum <- sum(tail(x,2))
while (sum <= 4e6) {
x <- append(x, sum)
return(x)
}
}
但是当我运行这个时,我只得到一个额外的斐波那契数字:
> fib(num)
[1] 1 2 3
反过来,我尝试移动return(x)
:
num <- c(1, 2)
fib <- function(x) {
sum <- sum(tail(x,2))
while (sum <= 4e6) {
x <- append(x, sum)
}
return(x)
}
但这似乎只会创造一个无限循环。
作为一个警告,我很容易用模数对偶数值项进行求和,并且在我解决这个特定问题之后我会这样做。
你能指出我的代码出错了吗? (如果你能给我一个正确的方向,而不提供更明显的解决方案。)
感谢@Minnow和@blakeoft帮助我解决这个问题。这就是我最终要解决这个问题的方法:
SPOILER ALERT
num <- c(1, 2)
fib <- function(x) {
last2 <- sum(tail(x,2))
while (last2 <= 4000000) {
x <- append(x, last2)
last2 <- sum(tail(x,2))
}
return(x)
}
由于我想保留特定于初始问题的答案,我不会在模数中包含最后一位。
答案 0 :(得分:3)
这是特定于语言的问题吗?你真的不需要一个函数,只有三个变量说prev
,curr
和next
。预加载前两个并填充偶数值&#39;和。您知道如何设置next
的值,然后处理它并将值推回历史记录中。
你不想要一个具体的答案,但现在你已经接受了一个,这就是我的意思 - 它不是r
,但它表明它有多么简单。
int sum = 2;
int prev = 1;
int curr = 2;
int next = 0;
while (next < 4000000) {
next = prev + curr;
if (next % 2 == 0)
sum += next;
prev = curr;
curr = next;
}
printf ("%d", sum);
答案 1 :(得分:2)
不放弃它:
浏览循环,看看是否可以找出预期的输出。你很接近,但事件的顺序不会产生你期望的结果。