一、问题描述
有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁。问第4个人多少岁,他说比第3个人大2岁。问第3人多少岁,他说比第2个人大2岁。问第2个人多少岁,他说比第1个人大2岁。最后问第1个人多少岁,他说他是10岁。编写python程序,求出当输入某个人时其对应的年龄。
二、问题分析
1、该问题是一个递归问题
2、要求出第5个人的年龄,则必须先知道第4个人的年龄,显然第4个人的年龄也是未知的, 但可以由第3个人的年龄推算出来。而想知道第3个人的年龄,又必须先知道第2个人的年龄,而第2个人的年龄取决于第1个人的年龄。 又已知每个人的年龄都比其前一个人的年龄大2,因此根据题意,可得到如下几个表达式:
age(5)=age(4)+2
age(4)=age(3)+2
age(3)=age(2)+2
age(2)=age(1)+2
age(1)=10
用数学公式表达为:
age(n)=age(n-1)+2,n>1
age(n)=10,n=1
三、算法设计
(1)函数递归调用的基础知识:
a.函数递归调用的定义:如果在调用一个函数的过程中又出现直接或间接地调用该函数本身,则称为函数的递归调用
b.程序中递归调用的方式:
(I)直接递归调用,即函数直接调用本身。在调用函数f()的过程中,又要调用f()函数,这就是函数的直接递归调用
例如:
def f(x):
......
y = f(n)
# 调用自身
......
return y
(II)间接递归调用,即函数间接调用本身。定义了两个函数f1()和f2()。在调用f1()函数的过程中,f1()又调用了函数f2(), 而在调用函数f2()的过程中,又调用了f1()
例如:
def f1(x):
......
z = f2(y)
......
return 2 * z
def f2(t):
......
c = f1(a)
......
return 3+c
c.在递归调用中不能出现无终止的调用,只能是有限次的递归调用,即必须有递归结束条件。因此,在代码中一定要有控制递归调用终止的语句
(2)将age(n)=10,n=1转成一个函数,在main()函数中通过调用age(n)函数就可以获知第n个人的年龄 (3)每次调用age()函数时并不会马上获得年龄值,而是不断地进行递归调用,直到调用到age(1)时才有确定的年龄值,然后再从age(1)一步步地递推回去
四、完整程序
def age(n):
if n == 1:
x = 10
else:
x = age(n - 1) + 2
return x
if __name__ == "__main__":
# n表示第几个人
n = int(input("请输入n的值: "))
# 调用age()函数,计算第n个人的年龄
print("第 %d 个人的年龄为: %d" % (n, age(n)))
五、运行结果