循环和递归求阶乘、递归实现汉诺塔程序、递归实现拆出每个位的数字放在列表中、递归求第五个人的年龄
递归就是自己调用自己
递归必须满足哪两个基本条件? 1、函数调用自身 2、设置了正确的返回条件
思考一下,按照递归的特性,在编程中有没有不得不使用递归的情况?
例如汉诺塔、目录索引(因为你永远不知道这个目录里边是否还有目录)、快速排序(二十世纪十大算法之一)、树结构的定义等如果使用递归,会事半功倍,否则会导致程序无法实现或相当难以理解
1、用循环求阶乘
def factorial(n):
result = n
for i in range(1, n):
result *= i
return result
number = int(input('请输入一个正整数:').strip())
res = factorial(number)
print('%d的阶乘是%d' % (number, res))
2、用递归就阶乘
def factorial(n):
if n < 1:
print('输入错误,请重新输入!')
elif n == 1:
return 1
else:
return n * factorial(n - 1)
num = int(input('请输入一个正整数:').strip())
print('%d的阶乘是%d' % (num,factorial(num)))
递归实现汉诺塔
def hanoi(n, x, y, z): # 共有n个盘子,从x挪到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, y, x, z) # 将y上的n - 1个盘子移动到z上
res = int(input('请输入汉诺塔的层数:').strip())
hanoi(res, 'X', 'Y', 'Z')
递归实现函数get_digits(n),将参数n分解出每个位的数字并按顺序放在列表中,举例:get_digits(12345)==>[1, 2, 3, 4, 5]
result = []
def get_digits(n):
if n > 0:
result.insert(0, n % 10)
get_digits(n // 10)
get_digits(678912324)
# get_digits(564)
result.sort()
print(result)
递归求第五个人的年龄:
有5个人坐在一起,问第五个人多少岁?他说比第四个人大2岁。问第四个人岁数,他说比第三个人大2岁。问第三个人,又说比第二个人大两岁。问第二个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
def age(n):
if n == 1:
return 10
else:
return age(n - 1) + 2
print('哈哈,我知道了,第五个人的年龄是%d' % age(5))