基础篇_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 说: 谢谢你

 

 

 

 

posted @ 2020-02-13 23:13  BNTU  阅读(127)  评论(0)    收藏  举报