使用Hylang的Python中的RecursionError

问题描述 投票:0回答:1

首先,我只想说我知道我在做什么并不理想,但是我正在尝试写该成员?使用Hy从The Little Schemer开始的功能。

(setv else True)

(defn null? [lst]
  " If list is empty return True else False "
  (if lst
      False
      True))


(defn member? [a lat]
  " Checks if value is a member of a list "
  (cond
    [(null? lat) False]
    [else (or (= (first lat) a)
              (member? a (rest lat)))]))

(print (member? 1 '(2 3 4 1)))

这完全符合我的期望。问题是,如果列表长度大于4个元素,我会得到错误

RecursionError: maximum recursion depth exceeded while calling a Python object

我知道Python不是要进行递归的,在the Python docs中它甚至说存在默认的递归限制以防止C堆栈溢出。在我的机器上,getrecursionlimit()的值为1000,在遇到段错误之前,我能够成功地将其设置为20,000以上。即使将其设置为20,000,我仍然会在5个元素的列表上遇到错误。我不明白的是...我如何在5个元素列表上达到20,000个以上的递归级别?

[对于那些好奇的人,我在15英寸Macbook Pro上使用Python 3.6.5,MacOS Mojave版本10.14.6,Hylang版本0.18.0,并且使用hy2py的程序输出是]]

from hy.core.language import first, rest
from hy import HyExpression, HyInteger
hyx_else = True


def is_null(lst):
    """ If list is empty return True else False """
    return False if lst else True


def is_member(a, lat):
    """ Checks if value is a member of a list """
    return False if is_null(lat) else first(lat) == a or is_member(a, rest(lat)
        ) if hyx_else else None


print(is_member(1, HyExpression([] + [HyInteger(2)] + [HyInteger(3)] + [
    HyInteger(4)] + [HyInteger(5)] + [HyInteger(1)])))

首先,我只想说我知道我在做什么并不理想,但是我正在尝试写该成员? The Little Schemer使用Hy的功能。 (setv else True)(defn null?[lst]“如果列表为空...

python recursion lisp the-little-schemer hy
1个回答
0
投票

我无法在Hy master上重现此内容。此错误可能是自0.18.0起修复的错误。

© www.soinside.com 2019 - 2024. All rights reserved.