Python: 學習系列之四:有趣的經典數學問題

系列

遞歸函數

"""
    遞歸的算法,必須滿足兩個條件:
    1. 原問題與新問題有相同的形式
    2. 遞歸就是一種循環,必須有一個遞歸出口退出循環
"""

"""
    n! = 1 * 2 * 3 * .... * n = (n-1)! * n 且 1!=1
    即fac(n) = fac(n-1)* n
"""


def fac(n):
    if n == 1:
        return 1
    return fac(n-1) * n


print(fac(5))  # 120


"""
    斐波那切數列
    F0 = 0, F1 = 1, Fn = F(n-1) + F(n-2)(n>=2)
"""
def fib(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    return fib(n-1) + fib(n-2)


print(fib(6))  # 8 , 0,1,2,3,5

舍罕王賞麥

"""
    印度的舍罕王重賞宰相:一個棋盤,第一格賞一粒麥,第二格賞兩粒,三格賞4粒,每一格比前一格多一倍,總共64格
"""

"""
    F1 = 1, F2 = F1* 2, F3 = F2* 2... F64 = F63 * 2
    F = F1 + F2 + F3 + ... + F64
"""


def shehanwang(n):
    t = 1
    s = 1
    for _ in range(2, n+1):
        t *= 2
        s += t

    return s


print(shehanwang(64))  # 18446744073709551615


# 另一種思路, 每一格是2的n-1次方
L = [2 ** i for i in range(0, 64)]
print(sum(L))  # 18446744073709551615

不重複的三位數

"""
    統計0-9這10個數字可以組成多少個不重複的三位數
"""

"""
    根據排列組合,去除0開頭的有:A[3,10] -A[2,9] = 10 * 9 * 8 - 9 * 8 =648
"""


def buchongfu():
    counter = 0

    for a in range(1, 10):
        for b in range(0, 10):
            for c in range(0, 10):
                if(c != b and b != a and a != c):
                    counter += 1
    return counter


print(buchongfu())  # 648

角谷猜想

"""
    給出任何自然數,反覆進行如下計算
    (1) 若爲奇數,則乘以3+1
    (2)若爲偶數,則除以2
    最後總可以得到運算結果爲1
"""


def jiaogu(n):
    nc = n
    while nc != 1:
        nc = nc * 3+1 if nc % 2 else nc / 2
    print('%d符合角谷猜想' % n)


jiaogu(50)  # 50符合角谷猜想

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章