【问题标题】:Alternative to recursion?递归的替代方案?
【发布时间】:2021-03-31 18:25:38
【问题描述】:

我开始学习 Python。现在我正在创建一个允许创建、查看或删除存储在 SQLite 3 DB 中的联系人的 CLI。问题是每次我完成一项任务时,我都会再次调用 main 函数,以便用户可以做其他事情。代码如下所示:

def main(self):
    print("What operation would you like to perform: Display contacts (1), add a new one (2), or remove one  (3)?")
    option = int(input())
    try:
        if option == 1:
            self.display()
            self.main()
        elif option == 2:
            self.new()
            self.main()
        elif option == 3:
            self.delete()
            self.main()
    except TypeError:
        print("Please introduce a valid option")
        sys.exit()

我很确定一个函数的连续调用会降低它的性能,我认为你可以调用一个递归函数的次数是有限制的,那么我应该如何再次调用 main 方法呢?

【问题讨论】:

  • 使用循环重复mainwhileoption == 1的所有内容
  • 您的except 子句永远不会被击中。您是否打算将option = int(input()) 行放在try 内?你知道,你真的不需要在那里承担异常的成本。您可以说if option == '1': 并跳过转换为整数。

标签: python python-3.x infinite-recursion


【解决方案1】:

关于递归调用,你是对的。它们可能很好,但迭代通常比递归更好。

你可以做很多事情来做无限编程,但对于 cli 来说,最简单的方法是将你的所有函数放在一个循环中。

这有点难看,但你不必每次都调用 main() 就可以了。

def main(self):
    again=True
    while again:
        print("What operation would you like to perform: Quit(0) Display contacts (1), add a new one (2), or remove one  (3)?")
        option = int(input())
        if option == 0:
            again=False
        if option == 1:
            self.display()
            self.main()
        elif option == 2:
            self.new()
            self.main()
        elif option == 3:
            self.delete()
            self.main()
        else:
            print("Please introduce a valid option")

话虽如此,你仍然需要调用 main()

【讨论】:

  • continue 是关键字,不能用作变量名或表达式。
  • continue=True 是语法错误,continue 是关键字
  • 您的代码中仍有continue 关键字,位于continue=False
【解决方案2】:

您可以使用 getoptargparse 等参数库

这里的主要目标是管理循环内的选项并一次性调用所有选项。例如:

$ python3 ./script.py -123

【讨论】:

    【解决方案3】:
    在 python 中,没有 "main function""main method" 这样的东西。 如果你愿意,你可以阅读constructorscall operations等。 所以,如果我理解正确 - 你想递归调用“main”方法。

    您可以像这样计算此方法中的出现次数: def main(self, count= <your number>): 在此之后,如果你想调用这个递归,创建循环或只是求和“count”:

    <some code here>
    if count == <your number>:
        return
    else:
        count += 5
    self.main(count)
    

    【讨论】:

    • 我没有投反对票,但听起来 OP 在问正好相反,即如何在这里不使用递归
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 2017-03-10
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多