PYTHON 解决递归调用错误的旁门左道

python当超过一定深度时会引发:RuntimeError: maximum recursion depth exceeded。

解决方案:

1、网上很多人给出的方案是调整sys.setrecursionlimit值,但这是一个治标不治本的方法。

2、优化代码不使用递归。

但有时候为了偷懒以及少点代码量(毕竟只有懒才能让我灵感爆发-。-)又想使用递归所以以上两种方案都不适合。于是就想能不能使用什么办法解决递归问题。

思考:

1、递归其实就是一直循环一个逻辑当达到条件时跳出。

2、python限制了深度,如何破解这个深度限制。

解决方案:

1、关于循环一个逻辑达到一个条件跳出倒好办可以使用一个循环来解决。

2、破解python限制深度,这目前俺还没有能力去做改解释器的能力所以就想了一个旁门左道,具体思路如下:

      2.1、首先做一个函数钩子(装饰器),在此装饰器里自定义:计数变量,调用上限变量,跳出状态变量;逻辑是当计数变量==调用上限变量时返回所有参数,然后用返回的参数再作为参数调用需要递归的方法。

      2.2、定义一个函数主逻辑就是一个死循环一直调用需要递归的方法,当达到你需要的条件时设置跳出变量为TRUE。跳出循环。

依据这个相法于是有了以下代码实现,以下代码只是一个DEMO,如需要使用到项目中可以按此逻辑设计一个MetaClass。

#!/usr/bin/env python3.6

# -*- encoding: utf-8 -*-

'''

@File    :   recursion.py

@Time    :   2020/01/16 23:06:51

@Author  :   Tang Jing 

@Version :   1.0.0

@Contact :   yeihizhi@163.com

@License :   (C)Copyright 2020

@Desc    :   None

'''

 

# here put the import lib

import functools

# code start

 

def recursion(func):

    def wapper(*args, **kwargs):

        try:

            kwargs['count'] += 1

            if kwargs['count'] == kwargs['upper-limit']:

                return args, kwargs

            return func(*args, **kwargs)

        except Exception:

            pass

    return wapper

 

def recursionCall(func, upper_limit:int=200, *args, **wargs):

    wargs['count'] = 1

    wargs['upper-limit'] = upper_limit

    wargs['break'] = False

    while True:

        args, wargs = func(*args, **wargs)

        if not wargs['break']:

            wargs['upper-limit'] = wargs['count']+upper_limit

        else:

            break

    return args, wargs

if __name__ == "__main__":

    @recursion

    def gggd(*args, **kwargs):

        if kwargs['bbb'] == 3001:

            kwargs['break']= True

            return args, kwargs

        print(kwargs['bbb'])

        kwargs['bbb']+=1

        return gggd(*args, **kwargs)

        

    kwargs={'bbb':1}

    eee=recursionCall(gggd,**kwargs)

    eeee=""

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值