1. 程式人生 > 其它 >第20期-分數序列求和

第20期-分數序列求和

1 問題描述

有一分數序列:

求出這個數列的前20項之和~

2 解題思路

從整體看,該序列的分子等於前一項的分子與分母之和;分母等於前一項的分子
該序列的分子為:2、3、5、8、13、21...,每一項數值為前兩項之和
該序列的分母為:1、2、3、5、8、13...,每一項數值為前兩項之和
該序列分子和分母的特徵與斐波那契數列非常相似,我們可以用求解斐波那契數列的方法求該數列前20項之和~​
關於如何求解斐波那契數列,大家可以檢視第7期-斐波那契數列(opens new window)的練習講解

斐波那契數列指的是這樣一個數列:
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 ……
這個數列從第3項開始,每一項都等於前兩項之和

3 解題方法

方法一:遞迴法

def f(x):
    if x == 1 or x == 2:
        return x
    return f(x - 1) + f(x - 2)


sum1 = 0
for i in range(1, 21):
    sum1 += f(i + 1) / f(i)
print(round(sum1, 2))
View Code

第1行:定義函式 f, 傳入引數 x
第2-3行:設定遞迴演算法的結束條件,當 x 等於 1 或 2 時,返回值為 x 本身
第4行:否則,根據該序列分子和分母的特點,返回值為每一項數值的前兩項之和
第7行:建立變數sum1, 用於儲存該序列最終的求和結果,初始賦值為 0
第8行:求該序列前20項之和,需迴圈20次,用for迴圈控制迴圈次數
第9行:該序列每一項可表示為 f(i + 1) / f(i) ,在每次迴圈中,將該序列的每一項與變數 sum1 相加,並將求和結果再賦值給sum1,這樣當for迴圈結束時,sum1的值就是求和結果
第10行:最後用print函式輸出計算結果,round函式保留兩位小數

方法二:for迴圈

a = 2
b = 1
sum1 = 0
for i in range(20):
    sum1 += a / b
    b, a = a, a + b
print(round(sum1, 2))
View Code

第1行:建立變數 a, 用來表示該序列的分子,初始賦值為 2
第2行:建立變數 b, 用來表示該序列的分母,初始賦值為 1
第3行:建立變數sum1, 用於儲存該序列最終的求和結果,初始賦值為 0
第4行:用for迴圈控制迴圈次數
第5行:該序列每一項可表示為 a / b ,在每次迴圈中,將該序列的每一項與變數 sum1 相加,並將求和結果再賦值給sum1
第6行:該序列的分子等於前一項的分子與分母之和,分母等於前一項的分子,即b, a = a, a + b
第7行:最後用print函式輸出計算結果,round函式保留兩位小數

在b, a = a, a + b這個式子中,右邊的表示式會在賦值變動之前執行,即先執行 '=' 等號右邊的表示式,再進行賦值
第1次迴圈,sum1 = 0 + 2 / 1, a + b = 3; 執行賦值後,b = 2, a = 3
第2次迴圈,sum1 = 0 + 2 / 1+3 / 2, a + b = 5; 執行賦值後,b = 3, a = 5
第3次迴圈,sum1 = 0 + 2 / 1+3 / 2 + 5 / 3, a + b = 8; 執行賦值後,b = 5, a = 8
以此類推,可計算出該序列前20項和