佩尔数列是一个整数数列。它的第一项为0,第二项为1,第3项是第2项的2倍再加上第1项,第4项是第3项的2倍再加上第2项,……。最初几个佩尔数是:0,1,2,5,12,29,70,169, 408, 985, 2378……。
请编写程序从键盘输入整数n,求出佩尔数列第n项。
可以使用递归的方法写一个pell函数,看起来很简洁,但效率很低,因为是非线性递归,大概连pell(50)都算不出来(千万不要尝试)。
>>> def pell(n):
if n == 1 or n == 2:
return n-1
else:
return 2*pell(n-1) + pell(n-2)
>>> def test():
while True:
n = input('请输入一个正整数,直接回车则退出:').strip()
if n:
print(pell(int(n)))
else:
print('Bye')
break
>>> test()
请输入一个正整数,直接回车则退出:5
12
请输入一个正整数,直接回车则退出:6
29
请输入一个正整数,直接回车则退出:7
70
请输入一个正整数,直接回车则退出:8
169
请输入一个正整数,直接回车则退出:15
80782
请输入一个正整数,直接回车则退出:
Bye
用循环的方式,虽然麻烦,但效率要高很多。
>>> def pell(n):
if n == 1 or n == 2:
return n-1
pre = [0, 1]
for i in range(2, n):
pre = [pre[1], 2*pre[1]+pre[0]]
return pre[-1]
>>> test()
请输入一个正整数,直接回车则退出:8
169
请输入一个正整数,直接回车则退出:15
80782
请输入一个正整数,直接回车则退出:50
2015874949414289041
请输入一个正整数,直接回车则退出:500
35770251205239459058076978435454985387873104128075398558406456207924399347082619617800934850824773906764543436814644745942616003093485810768803240499620489953405811359584564548662057576598709
请输入一个正整数,直接回车则退出:
Bye