项目欧拉#2在R

时间:2014-11-25 19:40:58

标签: r

我是编程的新手,我一直在尝试使用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)
}

由于我想保留特定于初始问题的答案,我不会在模数中包含最后一位。

2 个答案:

答案 0 :(得分:3)

这是特定于语言的问题吗?你真的不需要一个函数,只有三个变量说prevcurrnext。预加载前两个并填充偶数值&#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)

不放弃它:

浏览循环,看看是否可以找出预期的输出。你很接近,但事件的顺序不会产生你期望的结果。