基础篇_010_函数_递归
在函数中调用自身函数,简单的说就是:自己调用自己(可以想象一下"俄罗斯套娃")。
----递归的3大"戒律"(特性) ===》
1. 递归问题必须有一个明确的边界(结束条件)。
2. 每一次进入更深一步时,问题都要变简单。
3. 当递归的次数过多时会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧;每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
----"lhf"老师的问路实例
1. 需求:有一个叫"vivian"的女孩儿想要去沙河寻找"银角大王",但是迷路了,于是她就去问路。一路上依次有4个人: "alex", "blanca", "wpq", "yjdw",其中只有"yjdw"知道怎么走,于是就有了这样一幕:"vivian"首先问"alex":'请问怎样去沙河找"银角大王"?',但是"alex"不知道,说:'我不知道,但是看你相貌清秀,我去帮你问问"blanca"'。于是"alex"又问了"blanca"相同的问题,但是"blanca"也不知道啊,后者就问"wpq",当然"wpq"也不知道,最后"wpq"问了"yjdw","yjdw"说'我知道,往左再往左接着往左,然后直走就到了',然后"wpq"告诉"blanca", "blanca"告诉"alex","alex"在告诉"vivian"。
2. 解决问题 ===》
--(1). 这里一共有5个人,所以将他们存在一个列表里面: person_list = ["vivian", "alex", "blanca", "wpq", "yjdw"]。
--(2). 抛开姓名,发现就是4对一问一答,每次的过程和结果都非常相似,所以思考用递归,结束的条件就是问到"yjdw"。
--(3). 写程序 ===》
# "lhf"老师的问路问题
# 定义一个问路列表
PERSON_LIST = ["vivian", "alex", "blanca", "wpq", "yjdw"]
know_way_person = "yjdw"
# 定义问路的字符串
question = "%s : 靓仔 %s ,请问你知道怎样到沙河'银角大王'吗?"
answer = "%s : 我不知道,但是看你相貌清秀,我去帮你问问 %s "
answer_know_way_person = "%s : 我知道,往左再往左接着往左,然后直走就到了"
result_answer_way = "%s 对%s 说: %s告诉我,"
thanks = "vivian 对alex 说: 谢谢你"
def answer_way(person_list):
if len(person_list) == 0:
print("没人知道")
print("-" * 30)
return "没人知道"
# 将提问的人弹出列表
question_person = person_list.pop(0)
# 提取回答问题的人
answer_person = person_list[0]
# 将问题打印出来
print(question % (question_person, answer_person))
# 如果问到最后一个人还不是know_way_person,就直接退出,
# 因为下面的person_list[1]最少需要2个人在列表中
if len(person_list) == 1 and person_list[0] != know_way_person:
print("%s : 没人知道" % answer_person)
print("-" * 30)
return "没人知道"
# 如果回答问题的人是知道路的人,就直接结束此层函数调用
# 此时的列表中,第一个元素就是know_way_person
if answer_person == know_way_person:
print(answer_know_way_person % answer_person)
print("-" * 30)
return "往左再往左接着往左,然后直走就到了"
# 如果不是的话,就继续问路
else:
# person_list[1]的正确性由第1个if语句保证
print(answer % (answer_person, person_list[1]))
print("-" * 30)
# 返回最后的结果 "没人知道" / "往左再往左接着往左,然后直走就到了"
result = answer_way(person_list) # 递归调用
# 打印出最后问路的结果 person_list[0] 就是know_way_person
print((result_answer_way + result) % (answer_person, question_person, person_list[0]))
# 保证最后的返回值一层一层的上抛
return result
print("-" * 30)
answer_way(PERSON_LIST)
print("-" * 30)
print(thanks)
输出结果 ===》
D:\Python\Python37\python.exe D:/1学习/Python学习__我的代码/day003/风湿理论_函数即变量.py
------------------------------
vivian : 靓仔 alex ,请问你知道怎样到沙河'银角大王'吗?
alex : 我不知道,但是看你相貌清秀,我去帮你问问 blanca
------------------------------
alex : 靓仔 blanca ,请问你知道怎样到沙河'银角大王'吗?
blanca : 我不知道,但是看你相貌清秀,我去帮你问问 wpq
------------------------------
blanca : 靓仔 wpq ,请问你知道怎样到沙河'银角大王'吗?
wpq : 我不知道,但是看你相貌清秀,我去帮你问问 yjdw
------------------------------
wpq : 靓仔 yjdw ,请问你知道怎样到沙河'银角大王'吗?
yjdw : 我知道,往左再往左接着往左,然后直走就到了
------------------------------
wpq 对blanca 说: yjdw告诉我,往左再往左接着往左,然后直走就到了
blanca 对alex 说: yjdw告诉我,往左再往左接着往左,然后直走就到了
alex 对vivian 说: yjdw告诉我,往左再往左接着往左,然后直走就到了
------------------------------
vivian 对alex 说: 谢谢你

浙公网安备 33010602011771号