【问题标题】:Created function doesn't work (Python)创建的函数不起作用(Python)
【发布时间】:2015-07-03 07:05:06
【问题描述】:

我对 python 还很陌生,我试图用它来制作一个程序来计算 Stern-Brocot 序列的第 n 项(你可以查一下,这就是我的函数被调用的原因SBSeq)。由于某种原因,它不起作用,并且出现错误,如下所示:

File "C:/Python27/Factorials.py", line 6, in SBSeq
return ((n%2)*SBSeq(ceil(n/2)-1))+SBSeq(ceil(n/2))

最终会变成这样:

File "C:/Python27/Factorials.py", line 5, in SBSeq
if n == 1: return 1
RuntimeError: maximum recursion depth exceeded in cmp

这是原始代码。

import math
from math import ceil

def SBSeq(n):

if n == 1: return 1
return ((n%2)*SBSeq(ceil(n/2)-1))+SBSeq(ceil(n/2))

任何帮助将不胜感激!

【问题讨论】:

  • 下面问题的OP和你有同样的问题。请检查:stackoverflow.com/questions/24997970/…
  • 您的代码甚至无法编译。请发布一些有效的代码。
  • 我猜函数是用负输入调用的,对于负输入没有提前退出条件,ceil(n/2)-1 看起来很可疑。注意0*some_function()不会短路到0。
  • @Borja 我确实检查过,它没有和我一样的问题。我正在生成序列中的特定术语,而他/她正在生成列表。
  • @juanchopanza 它确实可以编译(好吧,无论如何,在 Python 2.7.9 中)。我没有把版本放在......对不起。

标签: python math modular-arithmetic ceil


【解决方案1】:

假设缩进问题不是真正的问题,问题是您的数字在递归时可以达到1以下,然后一旦达到1以下(即n达到0),它就会保持关于在不退出的情况下递归调用 SBSeq。

递归函数开始的条件应该是if n <= 1 : return 1

代码-

def SBSeq(n):
    if n <= 1: return 1
    return ((n%2)*SBSeq(ceil(n/2)-1))+SBSeq(ceil(n/2))

【讨论】:

    【解决方案2】:

    SBSeq(2) 调用SBSeq(0)SBSeq(0) 调用SBSeq(-1)SBSeq(-1) 调用SBSeq(-1) 永远。

    只需为SBSeq(0) 添加一个特殊情况。

    【讨论】:

      【解决方案3】:

      从调试器中可以发现SBSeq(2)调用SBSeq(0),然后无限调用SBSeq(-1)。当n 小于或等于 1 时,该函数也必须终止。

      这是改进后的功能:

      import math
      from math import ceil
      
      def SBSeq(n):
          if n <= 1: return 1 # not n == 1
          return ((n%2)*SBSeq(ceil(n/2)-1))+SBSeq(ceil(n/2))
      

      【讨论】:

        猜你喜欢
        • 2016-11-26
        • 1970-01-01
        • 2017-06-16
        • 1970-01-01
        • 2017-03-12
        • 1970-01-01
        • 1970-01-01
        • 2017-06-18
        • 1970-01-01
        相关资源
        最近更新 更多