一、抓鸭子递归
一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
所卖鸭子数=所赶鸭子数/2+1
所赶鸭子数-(所赶鸭子数/2+1)=2 --------第7个村子
递归出口(num==0), 递归函数体:所赶鸭子数=2*(sum+1),此时村庄数num-1
# 参数为村子数, 剩下的鸭子数和记录的信息,默认为空。
def duck(CunZiShu, duck_num, process=''):
# 根据剩下的鸭子数目计算刚到这个村时的鸭子数目
pre = 2*(duck_num+1)
# 终止条件
if CunZiShu == 0:
process = '出发时共赶{}只鸭子。'.format(duck_num) + process
# 打印最后结果
print(process)
else:
# 卖出的鸭子数目
sell = pre - duck_num
# 记录信息
process = '\n经过第{}个村庄卖了{}只鸭子,剩余{}只鸭。'.format(CunZiShu, sell, duck_num) + process
# 递归内容(上一个村子,上一个村子剩下的鸭子,记录的信息)
return duck(CunZiShu-1, pre, process)
duck(7,2)
二、角谷定理
输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。
如:输入22,
输出 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
n = int(input('请输入一个数字(自然数):'))
print('角谷猜想的整个序列是:')
result = [n]
while n!=1:
if n % 2 == 0:
k = int (n / 2)
n = k
result.append(n)
#print('%d'%n)
elif n == 1:
#print('%d'%n)
result.append(1)
break
else:
g = int (3 * n + 1)
n = g
result.append(n)
#print('%d'%n)
print(result)