1. 程式人生 > >《零基礎入門學習Python》(24)--遞迴:漢諾塔

《零基礎入門學習Python》(24)--遞迴:漢諾塔

前言

這節課主要講解用遞迴的方法,實現漢諾塔的解答 

知識點

這節課主要講解用遞迴的方法,實現漢諾塔的解答 

對於遊戲的玩法,我們可以簡單分解為三個步驟:

  • 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)