感覺用python很好實現:
#hailstone序列
defhaistone
(n):
hai_list =
while n > 1:
if n%2: #奇數
n = 3*n + 1
else: #偶數
n = n//2
else:
return hai_list
試下:
res = hailstone(42)
print(res)
#[42, 21, 64, 32, 16, 8, 4, 2, 1]
網上搜了下,有這麼個思考題:顯示哪個初始數字(小於50000)建立最長的冰雹序列?
最簡單的辦法是乙個乙個的試, 判斷出每個數字冰雹序列的長度,然後取最大的即可。
def
get_haistone_length
(n):
i = 1
while n > 1:
if n%2:
n = 3*n + 1
i += 1
else:
n = n//2
i += 1
return i
defget_longest_num
(a,b):
num = 1
key = 1
for i in range(a, b+1):
if get_haistone_length(i) > num:
num = get_haistone_length(i)
key = i
return (key, num)
試下結果:
b = get_longest_num(1,50000)
print(b)
#(35655, 324)
[finished in
1.6s]
再試個更大的:
b = get_longest_num(1,500000)
print(b)
#(410011, 449)
[finished in
16.7s]
花費時間已經很長了,在原有方法的基礎上進行適當優化,比如說10000這個數字,第一步先除以2,得到5000,此時很顯然,5000這個數字的冰雹序列長度我們之前算過了,所以直接直接可以得到10000的結果為5000的加上1。
演算法如下:
def
get_num
(a,b):
dict1 = {}
max = 1
num = 1
for x in range(a, b+1):
i = 1
m = x
while x > 1:
if x in dict1:
i += dict1[x] - 1
break
else:
if x%2:
x = 3*x + 1
i += 1
else:
x = x//2
i += 1
dict1[m] = i
if i > max:
max = i
num = m
return (num, max)
試一下:
lis = get_num(1,500000)
print(lis)
#(410011, 449)
[finished in
1.9s]
可以看出確實有很明顯的速度提公升。 學習 Python學習(一) Python問答
一.為什麼要使用python?python的主要特點有 1 軟體質量,python 具有很強的可讀性,因此在重用和維護方面就比較方便 2 編碼效率,python沒有編譯和鏈結庫的過程 3 程式移植性,不做任何修改,python可執行在windows和linux系統 4 豐富的支撐庫,python既可...
python學習清單大全 python學習清單
學習單子 a部 python 大神vamei的blog之python篇 大神vamei的部落格很是推薦 各方面寫的都很好 我暫時只是看過他的python 網路和django的部分,看下來簡單易懂,很適合做個學習的大綱,然後靠自己日後不斷的充實進去。文章中也簡要的列出常用的一些命令語法之類的。pyth...
python列表學習 python列表學習整理
list1 列表 是一種有序的集合,可以隨時新增和刪除其中的元素。list1 lily lucy peter abel 列印列表 print list1 遍歷列表 end 迴圈中不換行print x,end for x in list1 print x 列表個數 print len list1 列表...