Python 用循环重写递归函数

Python 用循环重写递归函数,python,Python,重写函数而不使用递归 def func(num): 如果num=2: queue.pop(索引) queue.append(值-1) queue.append(值-2) 其他: 如果索引==len(队列)-1: 打破 指数+=1 返回len(队列) 这项任务对我来说很有意思,我用以下方式处理它: def f(num): if num < 2: # margin condition return 1 start_list = [num] # create

重写函数而不使用递归

def func(num):
如果num<2:
返回1
其他:
返回函数(num-1)+func(num-2)
#TODO:使用“循环”而不是“递归”重写func。
下面可能是一个解决方案,但我不认为这是一个好方法,因为我正在使用“列表”的便利性

def func(num):
"""
我使用列表来模拟队列,
它是用传入的参数'num'初始化的,
然后判断它,如果它是ge2,则弹出它并附加两个num'num-1','num-2'。
重复一下,如果数字是lt 2,索引向右移动1。
当索引等于队列的“长度-1”时,如果队列已被“0”和“1”填满,
因为'func(0)=1','func(1)=1',所以结果是队列的长度。
"""
索引=0
队列=[num]
尽管如此:
值=队列[索引]
如果值>=2:
queue.pop(索引)
queue.append(值-1)
queue.append(值-2)
其他:
如果索引==len(队列)-1:
打破
指数+=1
返回len(队列)

这项任务对我来说很有意思,我用以下方式处理它:

def f(num):
    if num < 2:  # margin condition
        return 1
    start_list = [num]  # create initial list
    while True:
        new_list = []  # list to store new elements
        changes = 0  # check if there was elements >=2 
        for element in start_list:
            if element >= 2:
                new_list.append(element - 1)
                new_list.append(element - 2)
                changes += 1
            else:
                new_list.append(element)
        start_list = new_list  # change start_list for new run
        print(start_list)
        if changes == 0:
            return len(start_list)
def(num):
如果num<2:#余量条件
返回1
开始列表=[num]#创建初始列表
尽管如此:
new_list=[]存储新元素的列表
更改=0#检查是否有元素>=2
对于开始列表中的元素:
如果元素>=2:
新增列表。追加(元素-1)
新增列表。追加(元素-2)
变化+=1
其他:
新建列表。追加(元素)
开始列表=新列表#更改新运行的开始列表
打印(开始列表)
如果更改==0:
返回len(开始列表)
我做了性能检查num=25

我的解决方案速度:0.14056860000000002

递归速度:0.039106200000000001

您的非递归解决方案:1.6991333

所以它的速度快了10倍


谢谢你的任务

寻求更好的解决方案。非常感谢,我明白了,这是一个斐波那契。感谢你的解决方案,它确实比mime快得多。算法很神奇,我认为要编写像您这样的代码还有很长的路要走。顺便问一下,函数名lol是什么意思?@pythonist我真的很抱歉函数名,我是一个“有点”懒惰的人,经常在我的PC中调用临时文件夹lol或lol或KKK或XXX,我也经常这样调用临时Python函数(很快就会删除)。对不起,如果我冒犯了您,我刚刚忘记在复制粘贴到堆栈溢出之前更改函数名:(我现在更改了,再次抱歉。