在不使用递归的情况下重写递归函数

Posted

技术标签:

【中文标题】在不使用递归的情况下重写递归函数【英文标题】:Rewrite recursion function without using recursion 【发布时间】:2022-01-16 22:10:00 【问题描述】:

我目前正在研究一个很容易递归的函数。但我有一个问题,我总是得到一个错误,因为该函数经常被调用。所以我必须重写这个函数,以便不使用递归。 这是带有递归的函数:

def calculate_stock(stock, stock_base_line, days):
    sales_after_stock = stock - (stock_base_line/14)
    if sales_after_stock > 0:
        days +=1
        return calculate_stock(sales_after_stock, stock_base_line, days)        
    else:
        return days 

sales_after_stock 低于0 时,循环应该停止。

现在我尝试重写递归:

def calculate_stock(stock, stock_base_line, days):
    sales_after_stock = stock - (stock_base_line/14)     
    while(sales_after_stock > 0):
        if sales_after_stock > 0:
            days +=1
            sales_after_stock = sales_after_stock - (stock_base_line/14)                   
        else:
            return days
    else:
        return days

所以它没有正确减去sales_after_stock 的值,因此循环是无限的。我该如何解决这个问题?

【问题讨论】:

不应该将变量称为stock_after_sales 而不是sales_after_stock吗? 【参考方案1】:

您的实施存在几个问题:

您无需在 while 循环中检查 if sales_after_stock > 0,因为在每次循环迭代之前都会检查这一点。 你没有从sales_after_stock 中减去任何东西——每次你总是将它设置为等于stock - stock_base_line / 14

这应该适合你:

def calculate_stock(stock, stock_base_line, days):

    sales_after_stock = stock - stock_base_line / 14
    while sales_after_stock > 0:
        days += 1
        sales_after_stock -= stock_base_line / 14

    return days

【讨论】:

我实施了您的解决方案。我明白你的意思,但它仍然是一个无限循环。 只有当您的 stock_base_line 为负数或 0 时才有可能 我猜你现在不必将days 作为函数参数?它可能是一个内部变量,初始化为零

以上是关于在不使用递归的情况下重写递归函数的主要内容,如果未能解决你的问题,请参考以下文章

递归函数如何在数组中保存消息?

算法回溯:如何在不存储状态的情况下进行递归

Java如何在不使用递归的情况下导致栈溢出?

如何在不递归的情况下找到所有可能的字谜?

如何在不使用递归或`/`运算符的情况下进行除法?

将递归函数重写为管道函数组合