递归是编程学习中一个不可避免的关键概念,很多新手在刚开始接触时,经常一头雾水。那么,递归究竟是什么意思?
递归是一种在函数中调用自身的方法。通常递归会把一个复杂的问题分解成较小的子问题,直到达到一个基准情况(即不再调用自身,直接返回结果)。
递归函数通常有两个主要部分:
1、基准条件:当满足某个条件时,递归停止,函数不再调用自身。
2、递归调用:函数在解决问题的过程中调用自己,但问题的规模逐渐缩小。
递归的一个经典例子是计算阶乘,阶乘函数定义为:
def factorial(n):
if n == 1: # 基准条件:当 n 为 1 时返回 1
return 1
else:
return n * factorial(n - 1) # 递归调用
接下来我们换个生活的例子来理解递归:
老板打电话给秘书:
"准备好周末!我们要出差两天。"
秘书立刻给老公打电话:
"亲爱的,我和老板要出差,你这两天得自力更生了哈。"
老公露出狡黠的笑容,拨通了女友的电话:
"宝贝,我老婆出差了,来我家吧,咱俩乐呵乐呵!"
女友眼睛一亮,赶紧通知辅导功课的男孩:
"这周末你自由了,功课取消啦!" 男孩高兴的跳了起来,马上给爸爸打电话:
"爸,这个周末终于能跟你一起了!" 老板听到儿子的话,瞬间心软,拿起电话给秘书
说:
"出差取消了,我要陪我儿子过周末。"
秘书一边叹气,一边给老公打电话:
"不去了,周末在家。"
老公急得不行,赶紧给女友发消息:
“不好意思啊,老婆不出差了,计划取消!"
女友无奈地打给男孩:
"抱歉了,功课继续,赶紧准备学费吧。"
男孩一脸苦相,打给爸爸:
"对不起爸,我还是得上课..."
老板长叹一声,默默拿起手机又给秘书打了个电话:
"唉,准备出差吧..."
用 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)