python学习实例(5)

举报
兔老大 发表于 2021/04/22 01:34:55 2021/04/22
【摘要】 #============================================#5.1 计算思维是什么#============================================ #<程序: 找假币的第一种方法> by Edwin Shadef findcoin_1(L): if len(L) <=1: print("Error: coins are...

  
  1. #============================================
  2. #5.1 计算思维是什么
  3. #============================================
  4. #<程序: 找假币的第一种方法> by Edwin Sha
  5. def findcoin_1(L):
  6. if len(L) <=1:
  7. print("Error: coins are too few"); quit()
  8. i=0
  9. while i<len(L):
  10. if L[i] < L[i+1]: return (i)
  11. elif L[i] > L[i+1]: return (i+1)
  12. i=i+1
  13. print("All coins are the same")
  14. return(len(L)) #should not reach this point
  15. #<主要程序>
  16. import random
  17. n=int(input("Enter the number of coins >=2: "))
  18. w_normal=random.randint(2,5)
  19. index_faked=random.randint(0,n-1) # 0<= index <=n-1
  20. L=[]
  21. for i in range(0,n):
  22. L.append(w_normal)
  23. L[index_faked]=w_normal-1
  24. print(L)
  25. print("The index of faked coin:",findcoin_1(L))
  26. #============================================
  27. #5.2 递归(Rcurrence)的基本概念
  28. #============================================
  29. #<程序:递归加法>
  30. def F(a):
  31. if len(a) ==1: return(a[0]) #终止条件非常重要
  32. return(F(a[1:])+a[0])
  33. a=[1,4,9,16]
  34. print(F(a))
  35. #<程序:汉诺塔_递归>
  36. count=1
  37. def main():
  38. n_str=input('请输入盘子个数:')
  39. n=int(n_str)
  40. Hanoi(n,'A','C','B')
  41. def Hanoi(n, A, C, B):
  42. global count
  43. if n < 1:
  44. print('False')
  45. elif n == 1:
  46. print ("%d:\t%s -> %s" % (count, A, C))
  47. count += 1
  48. elif n > 1:
  49. Hanoi (n - 1, A, B, C)
  50. Hanoi (1, A, C, B)
  51. Hanoi (n - 1, B, C, A)
  52. if(__name__=="__main__"):
  53. main()
  54. #<程序:merge函数> by Edwin Sha
  55. def merge(L1,L2):
  56. if len(L1) ==0: return(L2)
  57. if len(L2) ==0: return(L1)
  58. if L1[0] < L2[0]:
  59. return([L1[0]]+merge(L1[1:len(L1)],L2))
  60. else:
  61. return([L2[0]]+merge(L1,L2[1:len(L2)]))
  62. X=merge([1,4,9],[10])
  63. print(X)
  64. #============================================
  65. #5.3 分治法(Divide-and-Conquer Algorithm)
  66. #============================================
  67. #<程序:最小值_循环>
  68. def M(a):
  69. m=a[0]
  70. for i in range(1,len(a)):
  71. if a[i]<m:
  72. m=a[i]
  73. return m
  74. a=[4,1,3,5]
  75. print(M(a))
  76. #<程序:最小值_递归> a是个数组
  77. def M(a):
  78. print(a)
  79. if len(a) ==1: return a[0]
  80. return (min(a[len(a)-1], M(a[0:len(a)-1])))
  81. L=[4,1,3,5]
  82. print(M(L))
  83. #<程序:最小值_分治>
  84. def M(a):
  85. #print(a) 可以列出程序执行的顺序]
  86. if len(a) ==1: return a[0]
  87. return ( min(M(a[0:len(a)//2]),M(a[len(a)//2:len(L)])))
  88. L=[4,1,3,5]
  89. print(M(L))
  90. #<程序:最小值和最大值_分治>
  91. A=[3,8,9,4,10,5,1,17]
  92. def Smin_max(a):
  93. if len(a)==1:
  94. return(a[0],a[0])
  95. elif len(a)==2:
  96. return(min(a),max(a))
  97. m=len(a)//2
  98. lmin,lmax=Smin_max(a[:m])
  99. rmin,rmax=Smin_max(a[m:])
  100. return min(lmin,rmin),max(lmax,rmax)
  101. print("Minimum and Maximum:%d,%d"%(Smin_max(A)))
  102. #<程序:归并排序merge sort>
  103. def msort(L):
  104. k=len(L)
  105. if k==0: return(L)
  106. if k==1: return(L)
  107. X1=L[0:k//2]; X2=L[k//2:k] #X1,X2 are local variables
  108. print("X1=",X1," X2=",X2) #看看输出是什么?知道递归是如何执行的。
  109. X1=msort(X1); X2=msort(X2)
  110. return(merge(X1,X2))
  111. #<程序: 全加器>
  112. def FA(a,b,c): # Full adder
  113. carry = (a and b) or (b and c) or (a and c)
  114. sum = (a and b and c) or (a and (not b) and (not c)) \
  115. or ((not a) and b and (not c)) or ((not a) and (not b) and c)
  116. return carry, sum
  117. #<程序:二进制加法-二分法算法> by Edwin Sha
  118. def add_divide(x,y,c=False):
  119. # x, y are lists of True or False, c is True or False
  120. # return carry and a list of x+y
  121. while len(x) < len(y): x = [False]+x
  122. while len(y) < len(x): y = [False]+y
  123. if len(x) ==1:
  124. ctemp, stemp=FA(x[0],y[0],c)
  125. return (ctemp, [stemp])
  126. if len(x) ==0: return c, []
  127. c1,s1=add_divide(x[len(x)//2:len(x)],y[len(y)//2:len(y)],c)
  128. c2,s2=add_divide(x[0:len(x)//2],y[0:len(y)//2],c1) #依赖关系!
  129. return(c2,s2+s1)
  130. #============================================
  131. #5.4 贪心算法(Greedy Algorithm)
  132. #============================================
  133. #<程序:找零钱_贪心>
  134. v=[25,10,5,1]
  135. n=[0,0,0,0]
  136. def change():
  137. T_str=input('要找给顾客的零钱,单位:分:')
  138. T=int(T_str)
  139. greedy(T)
  140. for i in range(len(v)):
  141. print('要找给顾客',v[i],'分的硬币:',n[i])
  142. s=0
  143. for i in n:
  144. s=s+i
  145. print('找给顾客的硬币数最少为:',s)
  146. def greedy(T):
  147. if T==0:return
  148. elif T>=v[0]:
  149. T=T-v[0]; n[0]=n[0]+1
  150. greedy(T)
  151. elif v[0]>T>=v[1]:
  152. T=T-v[1]; n[1]=n[1]+1
  153. greedy(T)
  154. elif v[1]>T>=v[2]:
  155. T=T-v[2]; n[2]=n[2]+1
  156. greedy(T)
  157. else:
  158. T=T-v[3]; n[3]=n[3]+1
  159. greedy(T)
  160. if(__name__=="__main__"):
  161. change()
  162. #<程序:GCD_贪心>
  163. def main():
  164. x_str=input('请输入正整数x的值:')
  165. x=int(x_str)
  166. y_str=input('请输入正整数y的值:')
  167. y=int(y_str)
  168. print(x,'和',y,'的最大公约数是:', GCD(x,y))
  169. def GCD(x,y):
  170. if x>y: a=x;b=y
  171. else: a=y;b=x
  172. if a%b ==0: return(b)
  173. return(GCD(a%b,b))
  174. if(__name__=="__main__"):
  175. main()
  176. #============================================
  177. #5.5 动态规划(Dynamic Programming)
  178. #============================================
  179. #<程序:最长递增子序列_动态规划>
  180. def LIS(L): #LIS (L):Longest Increasing Sub-list of List L
  181. Asc=[1]*len(L);Tra=[-1]*len(L) #设定起始值
  182. #Asc[i] 存放从L[0]到L[i]以L[i]为最大值的最长递增子序列的长度,
  183. # 这个最长数列肯定以L[i]结尾
  184. #Tra[i] 存此最长数列的前一个索引,以后好连起整个递增序列。
  185. for i in range(1,len(L)):
  186. X=[]
  187. for j in range(0,i):
  188. if L[i] > L[j]: X.append(j) #所有比L[i]小L[j]的索引放在X
  189. for k in X: #Asc[i]= max Asc[k]+1, for each k in X
  190. if Asc[i] < Asc[k]+1: Asc[i]=Asc[k]+1; Tra[i]=k
  191. print("Asc:",Asc)
  192. print("Tra:",Tra)
  193. max=0 #找到Asc中的最大值
  194. for i in range(1,len(Asc)):
  195. if Asc[i]>Asc[max]: max=i
  196. print("最长递增子序列的长度是",Asc[max])
  197. #将最长递增数列存到X
  198. X=[L[max]]; i=max;
  199. while (Tra[i] >=0):
  200. X=[L[Tra[i]]]+X
  201. i=Tra[i]
  202. print("最长递增子数列=",X)
  203. L=[5,2,4,7,6,3,8,9]
  204. LIS(L)
  205. #<程序:直接用递归函数计算Asc(k)>
  206. def Asc(k):
  207. if k==0: return(1)
  208. X=[]
  209. for i in range(0,k):
  210. if L[k] > L[i]: X.append(Asc(i)) #记录所有比L[k]小的Asc()
  211. if len(X) >0: return (max(X)+1)
  212. else: return(1)
  213. def LIS_R(L):
  214. X=[]
  215. for k in range(0, len(L)):
  216. X.append(Asc(k))
  217. print(X)
  218. print(max(X))
  219. L=[5,2,4,7,6,3,8,9]
  220. LIS_R(L)
  221. #<程序:背包问题_递归>
  222. w=[0,4,5,2,1,6] #w[i]是物品的重量
  223. v=[0,45,57,22,11,67] #v[i]是物品的价值
  224. n=len(w)-1
  225. j=8 #背包的容量
  226. x=[False for raw in range(n+1)]#x[i]为True,表示物品被放入背包
  227. def knap_r(n,j):
  228. if (n==0)or(j==0):
  229. x[n]=False
  230. return 0
  231. elif (j>=w[n])and(knap_r(n-1,j-w[n])+v[n]>knap_r(n-1,j)):
  232. x[n]=True
  233. return knap_r(n-1,j-w[n])+v[n]
  234. else:
  235. x[n]=False
  236. return knap_r(n-1,j)
  237. print("最大价值为:",knap_r(n,j))
  238. print("物品的装入情况为:",x[1:])
  239. #<程序:背包问题_动态规划>
  240. w=[0,4,5,2,1,6] #w[i]是物品的重量
  241. v=[0,45,57,22,11,67] #v[i]是物品的价值
  242. n=len(w)-1
  243. m=8 #背包的容量
  244. x=[False for raw in range(n+1)]#x[i]为True,表示物品被放入背包
  245. #a[i][j]是i个物品中能够装入容量为j的背包的物品所能形成的最大价值
  246. a=[[0 for col in range(m+1)] for raw in range(n+1)]
  247. def knap_DP(n,m):
  248. #创建动态规划表
  249. for i in range(1,n+1):
  250. for j in range(1,m+1):
  251. a[i][j]=a[i-1][j]
  252. if (j>=w[i]) and(a[i-1][j-w[i]]+v[i]>a[i-1][j]):
  253. a[i][j]=a[i-1][j-w[i]]+v[i]
  254. #回溯a[i][j]的生成过程,找到装入背包的物品
  255. j=m
  256. for i in range(n,0,-1):
  257. if a[i][j]>a[i-1][j]:
  258. x[i]=True
  259. j=j-w[i]
  260. Mv=a[n][m]
  261. return Mv
  262. #============================================
  263. #5.6 以老鼠走迷宫为例
  264. #============================================
  265. #<程序:老鼠走迷宫_递归>
  266. m=[[1,1,1,0,1,1,1,1,1,1],
  267. [1,0,0,0,0,0,0,0,1,1],
  268. [1,0,1,1,1,1,1,0,0,1],
  269. [1,0,1,0,0,0,0,1,0,1],
  270. [1,0,1,0,1,1,0,0,0,1],
  271. [1,0,0,1,1,0,1,0,1,1],
  272. [1,1,1,1,0,0,0,0,1,1],
  273. [1,0,0,0,0,1,1,1,0,0],
  274. [1,0,1,1,0,0,0,0,0,1],
  275. [1,1,1,1,1,1,1,1,1,1]]
  276. sta1=0;sta2=3;fsh1=7;fsh2=9;success=0
  277. def LabyrinthRat():
  278. print('显示迷宫:')
  279. for i in range(len(m)): print(m[i])
  280. print('入口:m[%d][%d]:出口:m[%d][%d]'%(sta1,sta2,fsh1,fsh2))
  281. if (visit(sta1,sta2))==0: print('没有找到出口')
  282. else:
  283. print('显示路径:')
  284. for i in range(10):print(m[i])
  285. def visit(i,j):
  286. m[i][j]=2
  287. global success
  288. if(i==fsh1)and(j==fsh2): success=1
  289. if(success!=1)and(m[i-1][j]==0): visit(i-1,j)
  290. if(success!=1)and(m[i+1][j]==0): visit(i+1,j)
  291. if(success!=1)and(m[i][j-1]==0): visit(i,j-1)
  292. if(success!=1)and(m[i][j+1]==0): visit(i,j+1)
  293. if success!=1: m[i][j]=3
  294. return success
  295. if(__name__=="__main__"):
  296. LabyrinthRat()
  297. #============================================
  298. #5.7 谈计算思维的美
  299. #============================================
  300. #++++++++++++++++++++++++++++++++++++++++++++
  301. #5.7.3 问题复杂度的研究之美
  302. #++++++++++++++++++++++++++++++++++++++++++++
  303. #<程序:Find all the factors of x and put them in list L>
  304. import math
  305. def factors(x,L):
  306. y=int(math.sqrt(x)) #x的平方根
  307. for i in range(2,y+1): #一个个找
  308. if (x %i ==0): #找到一个因数i
  309. print(i)
  310. L.append(i)
  311. factors(x//i,L) #递归找
  312. break #跳出for循环
  313. else: #cannot find a factor, so x is a prime
  314. L.append(int(x))
  315. print(int(x))
  316. L=[]
  317. factors(18,L)

 

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/83025212

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。