在Python 3中创建递归函数

时间:2013-11-17 06:34:24

标签: python list recursion

到目前为止,这就是我现在所拥有的

class X:
    def __init__(self,value,next=None):
        self.value = value
        self.next  = next

def linkedlist(l):
    if l == []:
        return None
    beg = end = X(l[0])
        for v in l[1:]:
            end.next = X(v)
            end = end.next
    return beg

lst1 = linkedlist(['a', 'b', 'c''])
lst2 = linkedlist(['a', 'b', 'c'])
lst3 = linkedlist(['c', 'a', 'b'])

我正在尝试创建一个递归函数,它将确定两个链接列表lst 1和lst 2是否相同。如果是,则返回True,否则返回False。

def is_same(lst1, lst2):
    if lst1.next == None or lst2.next == None: 
        return None 
    else:
        if lst1.next == lst2.next:
            return X(is_same(lst1.next, lst2.next))
        else:
            return True

我知道我的递归函数是错误的,但我遇到了麻烦,因为它一直给我错误。 " is_same"每次放入时函数都返回True:

is_same(lst1, lst2)
is_same(lst1, lst3) # This should be False

1 个答案:

答案 0 :(得分:4)

有一些问题。

  1. 这不会处理空列表(None)。
  2. lst1.next == lst2.next比较节点,而不是值。
  3. 永远不会比较第一个值。
  4. 您出于某种原因正在调用构造函数X
  5. 我想你想要这样的东西

    def is_same(lst1, lst2):
        return not lst1 and not lst2      \ 
            or lst1 and lst2              \
            and lst1.value == lst2.value  \
            and is_same(lst1.next, lst2.next)
    

    或者,您可能希望为了清晰起见而放弃托管(如果有人不知道andor的操作顺序。

    def is_same(lst1, lst2):
        return (not lst1 and not lst2) or (
            lst1 and lst2
            and lst1.value == lst2.value
            and is_same(lst1.next, lst2.next)
        )
    

    编辑:或者,对于更少的布尔操作,

    def is_same(lst1, lst2):
        if lst1:
            return lst2                       \
                and lst1.value == lst2.value  \
                and is_same(lst1.next, lst2.next)
        return not lst2