【问题标题】:Is it a bad practice to call a function recursively on error在错误时递归调用函数是一种不好的做法吗
【发布时间】:2021-12-31 17:16:24
【问题描述】:

所以我有一个简单的这个函数,它在出错时会被自己再次调用,直到它返回没有错误。

def enter_r_h() -> (float, float):
     try:
         r = float(input("\n--> Enter the radius of the cylinder\n"))
         h = float(input("--> Enter the height of the cylinder\n"))
     except ValueError:
         print("--> Values aren't entered correctly\n")
         return enter_r_h()
     return r, h

当用户输入错误的值时,这是一个写得很糟糕的解决方法吗,因为理论上这可能会导致堆栈溢出(python 中有这样的事情吗?)或 RecursionError。

【问题讨论】:

  • 在实现“尾递归”的语言中,这种事情变成了简单的“跳转”,并且造成的开销很小。 Python 没有,所以这是不好的做法。递归应该保留给需要递归的算法。在这种情况下,迭代解决方案更智能。
  • 好的,谢谢您的意见。我不会在实际工作中使用这些聪明的变通方法。

标签: python function recursion exception


【解决方案1】:

为什么不把它放在一个while循环中,这样你就不会构建堆栈了?然后你也可以统计尝试次数,如果用户不了解,可以杀死程序。

另一方面,您不太可能通过手动输入的尝试来填充堆栈。用户可能会在未满之前因年老而死。

【讨论】:

  • 默认堆栈大小为 1000,它适用于 所有 活动堆栈帧,而不仅仅是用于递归调用的堆栈帧。填充堆栈并不难。
  • 这并不难,但这个要求每次递归都需要一个失败的用户输入 - 这需要一个非常需要圆柱体体积的厚用户。
  • 那个让我非常努力地大声笑。我把它作为一个递归函数来做是因为我们的教授喜欢聪明的变通办法,而且因为在这个函数上失败真的很难,我想也许它可以作为一个有效的解决方案传递。
  • 您应该努力编写确实工作的代码,而不是按预期使用应该工作的代码。缓冲区溢出攻击之所以奏效,是因为代码没有预料到这样的最坏情况。
猜你喜欢
  • 2017-05-19
  • 1970-01-01
  • 2011-03-28
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 2018-11-15
  • 1970-01-01
  • 2018-10-03
相关资源
最近更新 更多