那么,递归究竟是什么意思?
def factorial(n):
if n == 1: # 基准条件:当 n 为 1 时返回 1
return 1
else:
return n * factorial(n - 1) # 递归调用
比如调用 factorial(5),过程如下:
factorial(5) -> 5 * factorial(4)
factorial(4) -> 4 * factorial(3)
factorial(3) -> 3 * factorial(2)
factorial(2) -> 2 * factorial(1)
factorial(1) -> 1
最终得到结果 5 * 4 * 3 * 2 * 1 = 120
。
接下来我们换个生活的例子来理解递归:
老板打电话给秘书:
"准备好周末!我们要出差两天。"
秘书立刻给老公打电话:
"亲爱的,我和老板要出差,你这两天得自力更生了哈。"
老公露出狡黠的笑容,拨通了女友的电话:
"宝贝,我老婆出差了,来我家吧,咱俩乐呵乐呵!"
女友眼睛一亮,赶紧通知辅导功课的男孩:
"这周末你自由了,功课取消啦!"
男孩高兴的跳了起来,马上给爸爸打电话:
"爸,这个周末终于能跟你一起了!"
老板听到儿子的话,瞬间心软,拿起电话给秘书说:
"出差取消了,我要陪我儿子过周末。"
秘书一边叹气,一边给老公打电话:
"不去了,周末在家。"
老公急得不行,赶紧给女友发消息:
"不好意思啊,老婆不出差了,计划取消!"
女友无奈地打给男孩:
"抱歉了,功课继续,赶紧准备学费吧。"
男孩一脸苦相,打给爸爸:
"对不起爸,我还是得上课..."
老板长叹一声,默默拿起手机又给秘书打了个电话:
"唉,准备出差吧..."
用 python 来实现以上的故事:
# 递归式的电话传递故事实现
def phone_story(state):
characters = [
"老板打电话给秘书说:“准备过周末吧,我们要出差了。”",
"秘书打电话给丈夫说:“我和老板要出差两天,你要照顾好自己。”",
"丈夫打电话给女友说:“我老婆出差了,回家吧,我们可以玩得开心。”",
"女友给自己辅导功课的男孩打电话:“这个周末不用辅导功课了。”",
"男孩打电话给父亲说:“爸爸,我们终于可以一起度过这个周末了。”",
"爸爸(老板)打电话给秘书说:“出差取消了。我要和我儿子一起过周末。”",
"秘书打电话给丈夫:“我不去了。”",
"丈夫打电话给女友:“对不起,我的妻子不去了。”",
"女朋友打电话给男孩:“你要交学费了。”",
"男孩打电话给他的父亲并说:“对不起爸爸,我要上课了。”"
]
print(len(characters))
print(state)
if state == len(characters):
print("爸爸打电话给他的秘书,故事循环回到起点...\n")
return
# 逐层推进
print(characters[state])
# 递归调用,模拟每个人逐步传递电话
phone_story(state + 1)
# 回溯时,角色开始改变决定
print(characters[len(characters) - state - 1])
# 从故事的第一个电话开始
phone_story(0)
下图也诠释了递归的真正内涵: