文章会进行定期迭代,大概是1周~1个月不等。不同阶段读者看到的就不一样,博客可以随意点,定稿后我在发到testerhome.
语言选择用:python
递归基本概念:1个函数直接或间接的调用了自己,并且每次调用内容大体上小于自身(比如去掉条件区域),一个实现功能的函数进行高级封装后,接收参数,也会先对接收的参数进行验证参数类型,这个是基于某些不需要先定义数据类型的语言。
解释下 就是 func(a)->return func() func等于符号 ()借指为调用
递归里还有一种尾递归和(正常递归)非尾递归,现在拿山里有个庙,老和尚和小和尚的故事,陷入循环的来做1个正常递归的例子。
如果这个是1个功能逻辑,我们该如何写。首先庙会是1个类,老和尚和小和尚会是类里面的成员属性(对象)
那么一开始是这样的:
class Miao(): #庙
def __init__(self,o_monk,y_monk):
self.o_monk =o_monk #老和尚
self.y_monk =y_monk #小和尚
老和尚因为 if 一件事 exists cin>>输出要讲故事的这件事。我们可以设计为比如老和尚等待生日。
生日离当前天数小于等于1天或者0天,生日满足了条件才开始讲故事。
if (birthday_day >=1 ):
birthday_day -= 1 # 递-1天 birthday_day = birthday_day-1
print("{0}小于1天啦,有天{1}生日快到了,生日当天送个副利...\n".format(birthday_day, self.o_monk))
#生日剩余时间为birthday_day
运行效率上-=1,等于其他语言的--,这个效率上比注释里面的高。因为python语言对象和对象的数据是一个绑定的关系。如果-=1 是对象的数据在每次条件表达式循环内,每次修改为传递给对象。每次修改为解除引用,数字略小的数字在解除对象引用后,不会被gc。如果是注释里面的,需要把左边的对象传递到右边在执行一次。当循环次数上一定量级后,二者效率差距很多。
接下来如果让老和尚不停的讲故事,如果真的直接写递归。我们会考虑到递归爆炸的问题,我们可递归设置1个次数。
import sys
sys.setrecursionlimit(15)#因为下面写法会有深递归的问题,所以添加了这个15次
我们假设在这个设计过程中,需要加1个蝴蝶的条件来打破。蝴蝶扇了下风,老和尚就停止讲故事了,如果没扇风,老和尚就喝口可乐继续讲故事。
首先我们需要有个随机数,这个随机数设计最好需要包含3个状态。前段,中段,后段,前段长度=后段长度
这个我们可以放到全局变量区域,同时导入import random,然后在把roll随机的变量在类成员函数里 通过 global roll 被成员函数使用。
import random
roll = random.randint(0, 4) #决定命运roll
import sys
sys.setrecursionlimit(15)#因为下面写法会有深递归的问题,所以添加了这个15次
class Miao(): #庙
def __init__(self,o_monk,y_monk):
self.o_monk =o_monk #老和尚的名字
self.y_monk =y_monk #小和尚的名字
#不是完全递归,只递归了一部分。前面条件讲述用num控制
def story(self,birthday_day):
"""
当老和尚生日了就开始讲这个故事
:param birthday_day: 剩余多少天生日 int
:return:
"""
# roll数据一处地方多用 0-4之间随机
global roll
if (birthday_day >=1 ):
birthday_day -= 1 # 每次随机减掉1个数字
print("{0}小于1天啦,有天{1}生日快到了,生日当天送个副利...\n".format(birthday_day, self.o_monk))
print("生日了,山里有个庙,庙里有个{0}和{1},老和尚开始讲故事".format(self.o_monk,self.y_monk))
if (roll == 2): # 如果roll点到2,老和尚就去睡觉了
roll = "困了" # 原地修改
print("老和尚那一瞬间有点{}了,睡觉去了".format(roll))
else:
print("老和尚喝了口阔乐,继续讲故事")
return self.story(birthday_day) # 递归时传入同样的参数
mbqm =Miao("老和尚","小和尚")
mbqm.story(5)
#如上文,目前是正常的递归,有1个不合理的地方,每次递归还会走一次把老和尚扳手指等生日,给写进去了,所以我们需要使用尾递归的方式。