图解python书-2.经典算法

经典算法

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.回溯法:

枚举法的升级版,将枚举过的记录下来

老鼠走迷宫

  1. 上下左右可走,就加入堆栈并往上走,并判断是否为出口
  2. 上下左右都不可走,就往回走,并标记为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]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

厨 神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值