我想了解代码真正转化为python3的内容,因为我无法在球拍中跟随它。谢谢你!
(define set-equal?
(lambda (s1 s2)
(and (set-subset? s1 s2)
(set-subset? s2 s1))))
(define set-subset?
(lambda (s1 s2)
(or (null? s1)
(and (member (car s1) s2)
(set-subset? (cdr s1) s2)))))
我不是一个球拍专家,但我至少可以阅读代码并弄清楚它是做什么的。
让我们从set-subset?
开始。这是一个递归函数,它接受两个列表s1
和s2
,并返回s1
中的每个项是否在s2
内。此函数的工作方式是返回s1
是否为空,或者s1
的第一个元素是否为s2
的成员,以及s1
中除第一个元素外的所有元素的列表是否为s2
的子集。
(null? s1)
返回列表s1
是否为空,(car s1)
返回列表s1
的第一个元素,(cdr s1)
返回列表s1
中除第一个元素以外的所有元素。
你可以把它翻译成Python中的
def set_subset(s1, s2):
return (not s1) or (s1[0] in s2 and set_subset(s1[1:], s2))
尽管这里假设s1
和s2
是list
s而不是set
s(如果s1
是一个集合,则不能调用s1[0]
或s1[1:]
)
set-equal?
建立在set-subset?
之上:如果两个集合互为对方的子集,则它们相等。同样,这将在Python中转换为
def set_equal(s1, s2):
return set_subset(s1, s2) and set_subset(s2, s1)
这些函数假定列表中没有任何重复的值。
然而,如果你在Python 3中使用set
对象,你不需要这些函数中的任何一个,因为Python 3已经内置了这些操作:球拍中的(set-subset? s1 s2)
相当于Python 3中的s1.issubset(s2)
,(set-equal? s1 s2)
相当于s1 == s2
。