编程思维-递归(一)

文章会进行定期迭代,大概是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个不合理的地方,每次递归还会走一次把老和尚扳手指等生日,给写进去了,所以我们需要使用尾递归的方式。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值