"""
递归的算法,必须满足两个条件:
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符合角谷猜想