链表类函数

2024-06-16 11:40:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建这个函数

    >>> str(Link('Hello'))
    'Hello'

    >>> str(Link(1, Link(2)))
    '1 -> 2'

    >>> print(Link(1 / 2, Link(1 // 2)))
    0.5 -> 0

    >>> str(Link(Link(1, Link(2, Link(3))), Link(4, Link(5))))
    '(1 -> 2 -> 3) -> 4 -> 5'

    >>> print(Link(Link(Link(Link('Wow')))))
    (((Wow)))

    >>> print(Link(Link('a'), Link(Link('b'), Link(Link('c')))))
    (a) -> (b) -> (c)

这是我的代码:

^{pr2}$

然而,我不知道该怎么做才能完成最后三个博士学位。 救命啊!!!在

class Link(object):
   empty = ()
   def __init__(self, first, rest=empty):
       self.first = first
       self.rest = rest

Tags: 函数代码selfresthelloobjectlinkclass
1条回答
网友
1楼 · 发布于 2024-06-16 11:40:13

看起来规则应该是,如果一个列表的头本身就是一个列表,那么可以格式化该列表,并将其放在括号中。像这样:

first = '({0})'.format(self.first) if isinstance(self.first, Link) else first
result += '{0} -> '.format(first)

现在,避免在rest上使用递归,而在first上间接使用递归有点奇怪。(这就是'{0}'.format(…)所做的,如果您没有定义__format__方法,它将调用您的__str__方法。)

所以,假设这是一个赋值,如果赋值告诉你不要使用递归,你就需要把它变成一个循环。另一方面,如果赋值没有说要避免递归,那么只在这两种情况下递归会简单得多:

^{pr2}$

附带说明:这是一个股票计划练习,移植到Python(这意味着你的老师要么不了解Python,要么不喜欢Python,这不是一个好兆头……),但它缺少了一部分。在

通常,您应该处理,例如,Link(1, 2)与{}不同。(在Lisp术语中,这是(1 . 2)(1 2))但是没有一个例子可以验证这一点,所以不清楚应该为前者输出什么。准备好因为没有读懂老师的想法而被划掉,除非你想这样做:

first = str(self.first)
if isinstance(self.first, Link):
    first = '({0})'.format(first)
if self.rest is Link.empty:
    return first
rest = str(self.rest)
if isinstance(self.rest, Link):
    return '{0} -> {1}'.format(first, self.rest)
else:
    # surely (1 2 . 3) is not the same list as (1 2 3) but the spec left it out?
    return '{0} .. {1}'.format(first, self.rest)

相关问题 更多 >