前言
这节课主要讲解用递归的方法,实现汉诺塔的解答
知识点
这节课主要讲解用递归的方法,实现汉诺塔的解答
对于游戏的玩法,我们可以简单分解为三个步骤:
- 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)