《零基礎入門學習Python》(24)--遞迴:漢諾塔
阿新 • • 發佈:2018-11-09
前言
這節課主要講解用遞迴的方法,實現漢諾塔的解答
知識點
這節課主要講解用遞迴的方法,實現漢諾塔的解答
對於遊戲的玩法,我們可以簡單分解為三個步驟:
- 1) 將前63個盤子從X移動到Y上。
- 2) 將最底下的第64個盤子從X移動到Z上。
- 3) 將Y上的63個盤子移動到Z上。
- 問題一:將X上的63個盤子藉助Z移到Y上;問題一:將X上的63個盤子藉助Z移到Y上;
- 1) 將前62個盤子從X移動到Z上。
- 2) 將最底下的第63個盤子移動到Y上。
- 3) 將Z上的62個盤子移動到Y上。
- 問題二:將Y上的63個盤子藉助X移到Z上。
- 1) 將前62個盤子從Y移動到X上。
- 2) 將最底下的第63個盤子移動到Z上。
- 3) 將X上的62個盤子移動到Y上
用遞迴方法實現
def hanoi(n,x,y,z): if n==1: print(x,'---->',z) else: hanoi(n-1,x,z,y)#將n-1個盤子從x移動到y上 print(x,'---->',z)#將最底下的最後一個從x移動到z hanoi(n-1,x,y,z)#將y上的n-1歌盤子移動到z上 n=int(input('請輸入漢羅塔的層數: ')) hanoi(n,'X','Y','Z') ------------------------------------------------------------------------------------ ======================== RESTART: D:/python/hanoi.py ======================== 請輸入漢羅塔的層數: 6 X ----> Y X ----> Z X ----> Z X ----> Y X ----> Z X ----> Y X ----> Y X ----> Z X ----> Z X ----> Y X ----> Y X ----> Z X ----> Y X ----> Z X ----> Z X ----> Y X ----> Z X ----> Y X ----> Y X ----> Z X ----> Y X ----> Z X ----> Z X ----> Y X ----> Y X ----> Z X ----> Z X ----> Y X ----> Z X ----> Y X ----> Y X ----> Z X ----> Z X ----> Y X ----> Y X ----> Z X ----> Y X ----> Z X ----> Z X ----> Y X ----> Y X ----> Z X ----> Z X ----> Y X ----> Z X ----> Y X ----> Y X ----> Z X ----> Y X ----> Z X ----> Z X ----> Y X ----> Z X ----> Y X ----> Y X ----> Z X ----> Z X ----> Y X ----> Y X ----> Z X ----> Y X ----> Z X ----> Z
課後習題
動動手
- 使用遞迴編寫一個十進位制轉換二進位制的函式(要求採用“除2取餘”的方式,結果與呼叫bin()一樣返回字串形式)
#迭代形式 def Dec2Bin(dec): temp=[] result='' while dec: x = dec%2 dec //=2 temp.append(x) while temp: result += str(temp.pop()) return result # print(temp.reverse()) temp = int(input('請輸入一個十進位制數值 ')) result=Dec2Bin(temp) print(result) #遞迴形式 def Dec2Bin(dec): result = '' if dec: result = Dec2Bin(dec//2) return result+str(dec%2) else: return result temp = int(input('請輸入一個十進位制數值 ')) print(Dec2Bin(temp)) #print(result)
使用遞迴程式設計求解以下問題:
有5個人坐在一起,問第五個人多少歲?他說比第4個人大2歲。問第4個人歲數,他說比第三個人大2歲。問第三個人,又說比第二個人大2歲。問第2個人,說比第一個人大2歲。最後問第一個人,他說是10歲。請問第五個人多大?
ef age(n):
if n == 1:
return 10
else:
return age(n-1) + 2
print('哈哈,我知道了,第五個人的年齡是 %d 歲,啵啵脆!' % age(5))
- 還記得求迴文聯字串那道題嗎?現在讓你使用遞迴的方式求解?
def is_palindrome(n, start, end):
if start > end:
return 1
else:
return is_palindrome(n, start+1, end-1) if n[start] == n[end] else 0
string = input('請輸入一串字串:')
length = len(string)-1
if is_palindrome(string, 0, length):
print('\"%s\"是迴文字串!' % string)
else:
print('\"%s\"不是迴文字串!' % string)