经典算法
1. 分治法:
多线程思维
2. 递归法:
自己调用自己,可以不需要进行任何运算工作
#n!=n·n(n-1)·(n-2)....1
#当return 1的时候代表递归结束了,开始汇总,return ans
def two_factorial(i):
if(i==0):
return 1;
else:
ans=i*two_factorial(i-1)
return ans
a=two_factorial(3)
print(a)
6
# 斐波那契数列 下一项是前两项之和
# 1. 是0 直接返回当前为0 1和2也直接返回1
# 2. 否则返回
def two_fib(n):
if n==0:
return 0
elif n==1 or n==2:
return 1
else:
return (two_fib(n-1)+two_fib(n-2))
n=int(input("请输入要斐波那契的项数:"))
for i in range(n+1):
print(f'fib{i}:{two_fib(i)}')
fib0:0
fib1:1
fib2:1
fib3:2
fib4:3
fib5:5
fib6:8
fib7:13
fib8:21
fib9:34
fib10:55
3.贪心法:
每一步都采用当前状态的最有力或最优化的选择
动态规划法:
斐波那契数列的改进方法,将计算过的存储起来,以便于下次使用
表查找法,是把数据存储到map里面
下面是存储到list里面,因为有重复的
def two_fib_dynatic(n,output):
if n==0:
return 0
elif n==1:
return 1
else:
output[0]=0
output[1]=1
for i in range(2,n+1):
output[i]=output[i-1]+output[i-2]
return output[n]
# output=[]
n=int(input("请输入你要斐波那契的项数:"))
output = [[] for i in range(n+1)]
for index in range(10):
print(index,two_fib_dynatic(index,output))
0 0
1 1
2 1
3 2
4 3
5 5
6 8
7 13
8 21
9 34
a=[]
a.append(1)
a
[1]
5.迭代法:
循环重复执行一段代码
# 1! ~ n!
sum=1
n=int(input("请输入n="))
for i in range(0,n+1):
for j in range(i,0,-1):
sum *= j
print(i,sum)
sum=1
0 1
1 1
2 2
3 6
4 24
5 120
6 720
7 5040
8 40320
9 362880
10 3628800
# 帕斯卡三角
a=[[1],[1,1],[1,2,1]]
print(a)
[[1], [1, 1], [1, 2, 1]]
def to_pasika(r):
for j in range(1,r+1):
temp_list=[]
for k in range(j):
if k==0:
temp_list.append(1)
else:
temp_list.append(int(temp_list[k-1]*(j-k+1)/k))
print((r-j)*' ',temp_list)
# for i in range(r):
to_pasika(10)
[1]
[1, 2]
[1, 3, 3]
[1, 4, 6, 4]
[1, 5, 10, 10, 5]
[1, 6, 15, 20, 15, 6]
[1, 7, 21, 35, 35, 21, 7]
[1, 8, 28, 56, 70, 56, 28, 8]
[1, 9, 36, 84, 126, 126, 84, 36, 9]
[1, 10, 45, 120, 210, 252, 210, 120, 45, 10]
6.枚举法:
保底办法
x=1
num=1000
while num>=0:
num-=x
x+=1
print(x-1)
45
for num in range(1,501):
if(num %5==0):
print(f'{num}是5的倍数')
5是5的倍数
10是5的倍数
15是5的倍数
20是5的倍数
25是5的倍数
30是5的倍数
35是5的倍数
40是5的倍数
45是5的倍数
50是5的倍数
55是5的倍数
60是5的倍数
65是5的倍数
70是5的倍数
75是5的倍数
80是5的倍数
85是5的倍数
90是5的倍数
95是5的倍数
100是5的倍数
105是5的倍数
110是5的倍数
115是5的倍数
120是5的倍数
125是5的倍数
130是5的倍数
135是5的倍数
140是5的倍数
145是5的倍数
150是5的倍数
155是5的倍数
160是5的倍数
165是5的倍数
170是5的倍数
175是5的倍数
180是5的倍数
185是5的倍数
190是5的倍数
195是5的倍数
200是5的倍数
205是5的倍数
210是5的倍数
215是5的倍数
220是5的倍数
225是5的倍数
230是5的倍数
235是5的倍数
240是5的倍数
245是5的倍数
250是5的倍数
255是5的倍数
260是5的倍数
265是5的倍数
270是5的倍数
275是5的倍数
280是5的倍数
285是5的倍数
290是5的倍数
295是5的倍数
300是5的倍数
305是5的倍数
310是5的倍数
315是5的倍数
320是5的倍数
325是5的倍数
330是5的倍数
335是5的倍数
340是5的倍数
345是5的倍数
350是5的倍数
355是5的倍数
360是5的倍数
365是5的倍数
370是5的倍数
375是5的倍数
380是5的倍数
385是5的倍数
390是5的倍数
395是5的倍数
400是5的倍数
405是5的倍数
410是5的倍数
415是5的倍数
420是5的倍数
425是5的倍数
430是5的倍数
435是5的倍数
440是5的倍数
445是5的倍数
450是5的倍数
455是5的倍数
460是5的倍数
465是5的倍数
470是5的倍数
475是5的倍数
480是5的倍数
485是5的倍数
490是5的倍数
495是5的倍数
500是5的倍数
for i in range(4):
for j in range(3-i+1):
print(i,j,3-i-j)
0 0 3
0 1 2
0 2 1
0 3 0
1 0 2
1 1 1
1 2 0
2 0 1
2 1 0
3 0 0
list(range(4))
[0, 1, 2, 3]
7.回溯法:
枚举法的升级版,将枚举过的记录下来
老鼠走迷宫
- 上下左右可走,就加入堆栈并往上走,并判断是否为出口
- 上下左右都不可走,就往回走,并标记为2表示走过的
# 定义一个Node类,节点类型,用于链表
class Node:
def __init__(self,x,y):
self.x=x
self.y=y
self.next=None
class TraceRecord:
def __init__(self):
self.first=None
self.last=None
# 路径是否为空
def isEmpty(self):
return self.first==None
def insert(self,x,y):
newNode=Node(x,y)
if self.first==None:
self.first=newNode
self.last=newNode
else:
self.last.next=newNode
self.last=newNode
def delete(self):
if self.first==None:
print('队列已经空了')
return
newNode=self.first
while newNode.next!=self.last:
newNode=newNode.next
newNode.next=self.last.next
self.last=newNode
ExitX=8
ExitY=10
MAZE=[
[1,1,1,1,1,1,1,1,1,1,1,1],
[1,0,0,0,1,1,1,1,1,1,1,1],
[1,1,1,0,1,1,0,0,0,0,1,1],
[1,1,1,0,1,1,0,1,1,0,1,1],
[1,1,1,0,0,0,0,1,1,0,1,1],
[1,1,1,0,1,1,0,1,1,0,1,1],
[1,1,1,0,1,1,0,1,1,0,1,1],
[1,1,1,1,1,1,0,1,1,0,1,1],
[1,1,0,0,0,0,0,0,1,0,0,1],
[1,1,1,1,1,1,1,1,1,1,1,1],
]
def chkExit(x,y,ex,ey):
if(x==ex and y==ey):
zuo=MAZE[x-1][y]
you=MAZE[x+1][y]
shang=MAZE[x][y+1]
xia=MAZE[x][y-1]
if(zuo==you==shang==1 and xia==2):
return 1
if(zuo==you==xia==1 and shang==2):
return 1
if(xia==you==shang==1 and zuo==2):
return 1
if(zuo==xia==shang==1 and you==2):
return 1
return 0
path=TraceRecord()
x=1
y=1
print('原路径:')
for i in MAZE:
print(i)
# print(MAZE)
while x<=ExitX and y<=ExitY:
MAZE[x][y]=2
if( MAZE[x-1][y]==0):
x-=1
path.insert(x,y)
elif MAZE[x+1][y]==0:
x+=1
path.insert(x,y)
elif MAZE[x][y-1]==0:
y-=1
path.insert(x,y)
elif MAZE[x][y+1]==0:
y+=1
path.insert(x=x,y=y)
elif chkExit(x,y,ExitX,ExitY)==1:
break
else:
MAZE[x][y]=2
path.delete()
x=path.last.x
y=path.last.y
print('之后路径:')
for i in MAZE:
print(i)
原路径:
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1]
[1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1]
[1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1]
[1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1]
[1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1]
[1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1]
[1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
之后路径:
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 2, 1, 1, 2, 2, 2, 2, 1, 1]
[1, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1]
[1, 1, 1, 2, 2, 2, 2, 1, 1, 2, 1, 1]
[1, 1, 1, 2, 1, 1, 0, 1, 1, 2, 1, 1]
[1, 1, 1, 2, 1, 1, 0, 1, 1, 2, 1, 1]
[1, 1, 1, 1, 1, 1, 0, 1, 1, 2, 1, 1]
[1, 1, 0, 0, 0, 0, 0, 0, 1, 2, 2, 1]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]