Python學習 Hailstone 冰雹序列

2021-08-14 16:33:52 字數 1999 閱讀 6373

感覺用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 列表...