1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
"""
函数递归调用 - 函数直接或者间接的调用了自身
1. 收敛条件
2. 递归公式

n! = n * (n-1)!
f(n) = f(n-1) + f(n-2)
1 1 2 3 5 8 13 21 34 55 ...
"""
from contextlib import contextmanager
from time import perf_counter


def fac(num):
"""求阶乘"""
assert num >= 0
if num in (0, 1):
return 1
return num * fac(num - 1)


def fib2(num):
"""普通函数"""
a, b = 1, 1
for _ in range(num - 1):
a, b = b, a + b
return a


def fib3(num):
"""生成器"""
a, b = 0, 1
for _ in range(num):
a, b = b, a + b
yield a


# 动态规划 - 保存可能进行重复运算的中间结果(空间换时间)
def fib(num, results={}):
"""斐波拉切数"""
assert num > 0
if num in (1, 2):
return 1
try:
return results[num]
except KeyError:
results[num] = fib(num - 1) + fib(num - 2)
return results[num]


@contextmanager
def timer():
try:
start = perf_counter()
yield
finally:
end = perf_counter()
print(f'{end - start}秒')


def main():
"""主函数"""
# for val in fib3(20):
# print(val)
# gen = fib3(20)
# for _ in range(10):
# print(next(gen))
for num in range(1, 121):
with timer():
print(f'{num}: {fib(num)}')
# print(fac(5))
# print(fac(-5))


if __name__ == '__main__':
main()

Hannoi

1
2
3
4
5
6
7
8
9
10
def hannoi(n, a, b, c):
if n == 1:
print(a, '-->', c)
return
else:
hannoi(n - 1, a, c, b)
print(a, '-->', c)
hannoi(n - 1, b, a, c)

hannoi(10, "a", "b", "c")

renyi停车常数

随机停车

1
2
3
4
5
6
7
8
9
10
11
12
'''
renyi停车常数
0.7475972
'''
import random
def parking(low,high):
if high-low<1:
return 0
else:
x=random.uniform(low,high-1)
return parking(low,x)+1+parking(x+1,high)
print parking(0,5)