天天看點

Hailstone序列Hailstone序列

Hailstone序列

定義

Hailstone序列定義:

H a i l s t o n e ( n ) = { { 1 } , n  <=1 { n } ∪ H a i l s t o n e ( n / 2 ) , if  n  is even { n } ∪ H a i l s t o n e ( 3 n + 1 ) , if  n  is odd Hailstone(n)= \begin{cases} \{1\},&\text{$n$ <=1}\\ \{n\}\cup Hailstone(n/2),&\text{if $n$ is even}\\ \{n\}\cup Hailstone(3n+1),&\text{if $n$ is odd} \end{cases} Hailstone(n)=⎩⎪⎨⎪⎧​{1},{n}∪Hailstone(n/2),{n}∪Hailstone(3n+1),​n <=1if n is evenif n is odd​

有窮性:

​ 對于任意的N,總有 ∣ H a i l s t o n e ( n ) ∣ < 無 窮 |Hailstone(n)|<無窮 ∣Hailstone(n)∣<無窮?

Hailstone序列的非遞歸實作

def hailstone(n):
    hailstone_list = []#記錄序列
    while n > 1:
        hailstone_list.append(int(n))
        if n % 2 == 0:
            n = n / 2
        else:
            n = 3 * n + 1
    if n <= 1:
        hailstone_list.append(int(n))

    return hailstone_list, len(hailstone_list)
           

上述代碼為Hailstone序列的非遞歸實作,下面我們作圖來看一下n與Hailstone序列的關系

import matplotlib.pyplot as plt
nums = range(500)#觀察前500數的Hailstone序列

y_nums = [hailstone(x)[1] for x in nums]

fig = plt.figure()
plt.scatter(nums, y_nums)
plt.xlabel('n')
plt.ylabel('hailstone值')
plt.show()
           

運作結果為:

Hailstone序列Hailstone序列

Hailstone序列的遞歸實作

def recursive_hailstone(hailstone_list):
    """
    hailstone(n)序列求解,遞歸算法
    :param hailstone_list: 這裡傳入的是清單格式,比如[6],計算清單末尾的Hailstone序列
    :return:
    """
    n = hailstone_list[-1]
    if n <= 1:
        return 1
    if n % 2 == 0:
        hailstone_list.append(n // 2)
    else:
        hailstone_list.append(int(3 * n + 1))
    recursive_hailstone(hailstone_list)

           

運作測試:

test_list = [6]
recursive_hailstone(test_list)
print(test_list)

#結果
[6, 3, 10, 5, 16, 8, 4, 2, 1]