本期内容详解:
斐波那契数列的两种实现方式:
迭代的方式:
def fab(n):
n1 = 1
n2 = 1
n3 = 1
if n < 1:
n = int(input('输入有误,请重新输入:'))
return -1
while n-2 > 0:
n3 = n1 + n2
n1 = n2
n2 = n3
n -= 1
return n3
result = fab(30)
if result != -1:
print('总共有%d对小兔崽子诞生!'%result)
递归的实现方式:
def fab(n):
if n < 1:
print('输入有误!')
return -1
if n == 1 or n == 2:
return 1
else:
return fab(n-1) + fab(n-2)
result = fab(30)
if result != -1:
print('总共有%d对小兔崽子诞生!'%result)
用递归的方式解决汉诺塔问题:
def hannoi(n,x,y,z):
if n == 1:
print(x,'-->',z)
else:
hannoi(n-1,x,z,y)#将前n-1个盘子移动到y上
print(x,'-->',z)#将最底下的盘子移动到z上
hannoi(n-1,y,x,z)#将y上的n-1个盘子移动到z上
n = int(input('请输入汉诺塔的层数:'))
hannoi(n,'X','Y','Z')
典型课后题
使用递归编写一个十进制转换为二进制的函数(要求采用“取2取余”的方式,结果与调用bin()一样返回字符串形式)。
def Bin(n):
temp = ''
if n:
temp = Bin(n//2)
temp += str(n%2)
return temp
else:
return temp
num = int(input('请输入一个十进制数:'))
print(num,'-->',Bin(num))
写一个函数get_digits(n),将参数n分解出每个位的数字并按顺序存放到列表中。举例:get_digits(12345) ==>
[1, 2, 3, 4, 5]
解题思路:利用除以10取余数的方式,每次调用get_digits(n//10),并将余数存放到列表中即可。要注意的是结束条件
设置正确。
def get_digits(n):
result = ''
if n:
result = get_digits(n//10)
result += str(n%10)
return list(result)
num = int(input('请输入一个数:'))
print(get_digits(num))
还记得求回文字符串那道题吗?现在让你使用递归的方式来求解,亲还能傲娇的说我可以吗?
解题思路:有好多种方法,不过综合效率来说,小甲鱼的实现方式比较朴素,利用递归每次索引前后两个字符进行对
比,当start > end的时候,也正是首尾下标“碰面”的时候,即作为结束递归的条件。
def Huiwen(temp,start,end):
if start > end:
return 1
else:
if temp[start]==temp[end]:
return Huiwen(temp,start+1,end-1)
else:
0
temp = input('请输入一段文字:')
length = len(temp)
end = len(temp)-1
if Huiwen(temp,0,end):
if temp[0:length//2] == temp[length//2:length]:
print('%s不是一个回文字符串!'%temp)
else:
print('%s是一个回文字符串!'%temp)
else:
print('%s不是一个回文字符串!'%temp)
使用递归编程求解以下问题:
def Age(n):
if n == 1:
return 10
if n > 1:
age = 10
age = Age(n-1) + 2
return age
num = int(input('请输入要查询的编号:'))
print('第%d个人的年龄是:%d'%(num,Age(num)))