# Recursion ###### tags: `week7` `上課筆記` ### 1. factorial ```python=1 def factorial(n): if n <= 1:return 1 else:return n*factorial(n-1) ``` ### 2. recursion深度: ```python=1 import sys sys.getrecursionlimit() 預設上限1000 改變上限: sys.setrecursionlimit(10000) ``` ### 3. power set: ```python=1 def listofsub(s): n = len(s); l = list(s); o = [] def subset(d,r): nonlocal n,l,o if d == n: o.append(r.copy()) return subset(d+1,r);r.add(l[d]) subset(d+1,r);r.remove(l[d]) subset(0,set()) return o ``` ### 4. merge sort ```python=1 def merge(a,l,m,r): i,j,t= l,m+1,[] while i <= m or j <= r: if i > m: t.append(a[j]); j+= 1 elif j>r: t.append(a[i]); i += 1 elif a[i] < a[j]: t.append(a[i]); i+= 1 else: t.append(a[j]); j += 1 for k in range(1,r+1): a[k] = t[k-1] def sort(a,l,r): if l >= r : return m = (l+r)//2 sort(a,l,m) sort(a,m+1,r) merge(a,l,m,r) def mergesort(a): sort(a,0,len(a)-1) a = [4,5,6,3,8,7,9] mergesort(a) ``` ### 5.Goodstein sequence ```python=1 def process(b,n): k,l =0,[] while b**(k+1)<=n:k+=1 for i in range(k,-1,-1): q =n//(b**i) if q > 0: n -= q*(b**i) l.append([i,q]) for x in l: if x [0]>=b:x[0] = process(b,x[0]) return l print(process(3,7625597485041)) def evaluate(b,l): v = 0 for x in l: y = x[0] v += x[1]*b**(y if type(y) is int else evaluate(b,y)) return v def go(b,n): return evaluate(b+1,process(b,n)) ``` ### 6. Hanoi Tower ```python=1 n = eval(input('n = ')) s = 0 #s代表狀態(stage) p = [0] #p[i]代表i號碟所在的柱子 for i in range(1,n+1):p.append(1) def hanoi(m,x,y,z,/): '''從x號柱此刻最上方的m個碟子藉由中繼y柱搬到z柱''' global s if m == 1: for i in range(1,n+1): if p[i] == x: p[i] = z print('x:',x,'y:',y,'z:',z) print(f'第{(s:=s+1)}步:把{i}號碟從{x}號柱移到{z}號柱') break else: hanoi(m-1,x,z,y) hanoi(1,x,y,z) hanoi(m-1,y,x,z) hanoi(n,1,2,3) ``` > [name=顧定克] ### 7. Hanoi四根柱子 ```python=1 def hanoi4(m,w=1,x=2,y=3,z=4): global steps if m==1: for i in range(1,n+1): if p[i]==w: p[i]=z steps+=1 print(f'第{steps}步將{i}號環從{w}號柱移到{z}號柱') break elif m==2: hanoi4(1,w,y,z,x) hanoi4(1,w,x,y,z) hanoi4(1,x,w,y,z) else: hanoi4(m-2,w,y,z,x) hanoi4(1,w,x,z,y) hanoi4(1,w,x,y,z) hanoi4(1,y,w,x,z) hanoi4(m-2,x,w,y,z) ``` > [name=tzuenting]