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符合角谷猜想
发布了105 篇原创文章 · 获赞 46 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/wucong60/article/details/90348362