📜  斐波那契数列中从 1 到 N 的数字之和(1)

📅  最后修改于: 2023-12-03 15:40:05.325000             🧑  作者: Mango

斐波那契数列中从 1 到 N 的数字之和

斐波那契数列是指一个序列中第一个元素为0,第二个元素为1,从第三个元素开始,每个元素都是前两个元素的和。具体数列如下:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, ...

现在我们需要计算斐波那契数列中从1到N的数字之和。

解法一:暴力枚举

我们可以使用一个循环枚举出从1到N的所有数字,并且计算它们在斐波那契数列中的值,再将它们累加起来。具体代码如下:

def fibonacci(n):
    if n <= 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n-1) + fibonacci(n-2)

def fibonacci_sum(n):
    sum = 0
    for i in range(1, n+1):
        sum += fibonacci(i)
    return sum

这段代码由两个函数构成,fibonacci函数用来计算斐波那契数列中第n个数字的值,fibonacci_sum函数用来计算斐波那契数列中从1到n的数字之和。

时间复杂度:O(N^2)

解法二:优化暴力枚举

我们可以发现,在计算fibonacci_sum(n)的过程中,我们重复计算了很多数字的斐波那契值,因为满足递推关系的数字的斐波那契值是一样的。所以我们可以用一个数组将之前计算过的数字的斐波那契值保存下来,避免重复计算。具体代码如下:

def fibonacci_sum(n):
    if n <= 0:
        return 0
    elif n == 1:
        return 1
    else:
        F = [0] * (n+1)
        F[1] = 1
        for i in range(2, n+1):
            F[i] = F[i-1] + F[i-2]
        return sum(F[1:])

这段代码只有一个函数fibonacci_sum,它用来计算斐波那契数列中从1到n的数字之和。

时间复杂度:O(N)

解法三:公式法

通过推导,我们可以得到斐波那契数列的通项公式:

F(n) = (1/sqrt(5)) * [((1+sqrt(5))/2)^n - ((1-sqrt(5))/2)^n]

其中,sqrt代表平方根。

利用这个公式,我们可以直接计算出斐波那契数列中从1到n的数字之和,具体代码如下:

def fibonacci_sum(n):
    sqrt_5 = math.sqrt(5)
    return int(((1/sqrt_5) * (((1+sqrt_5)/2)**(n+2) - ((1-sqrt_5)/2)**(n+2))) - 1)

这段代码只有一个函数fibonacci_sum,它用来计算斐波那契数列中从1到n的数字之和。

时间复杂度:O(1)

以上三种解法中,解法一和解法二都是通过递归或循环来计算斐波那契数列中的每一个数字,时间复杂度是O(N)或O(N^2)。而解法三则是直接使用通项公式计算,时间复杂度是O(1)。所以,在需要高效计算斐波那契数列中从1到N的数字之和时,使用公式法是最好的选择。