【问题标题】:Project Euler #2 in RR 中的 Project Euler #2
【发布时间】:2015-01-23 23:04:35
【问题描述】:

我是编程新手,我一直在尝试 Project Euler 以了解有关 R 的更多信息。

困扰我的问题如下:

斐波那契数列中的每个新项都是通过添加前两项来生成的。从 1 和 2 开始,前 10 个术语将是:

1、2、3、5、8、13、21、34、55、89

通过考虑斐波那契数列中值不超过 400 万的项,求偶数项之和。

我已经开始通过设置序列中的前几个数字来解决这个问题:

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 帮助我解决这个问题。以下是我最终解决此问题的方法:

剧透警告

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)
}

我不会在模数中包含最后一位,因为我想保留针对初始问题的答案。

【问题讨论】:

    标签: r


    【解决方案1】:

    这是特定于语言的问题吗?你并不需要一个函数,只需要三个变量prevcurrnext。预加载前两个并填充偶数的总和。您知道如何设置 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);
    

    【讨论】:

    • 感谢您的帮助,但我不清楚如何在没有循环的情况下将它们推回历史。
    • 现在您的实际问题已经得到满足,我扩展了我的答案。
    • 酷,我以前从未见过这种方法,所以谢谢你的分享。一旦我再次投票,我将在几个小时后投票赞成这个答案。
    【解决方案2】:

    不放弃:

    遍历您的循环,看看您是否可以计算出预期的输出。你已经接近了,但事件的顺序不会产生你所期望的。

    【讨论】:

    • 附加提示:在循环的每次迭代结束时,注意每个变量发生了什么。声明的只有3个,分别是numsumx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2023-03-15
    • 2016-08-12
    • 1970-01-01
    相关资源
    最近更新 更多