第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項和