我想递归地反转链表中的数字顺序。
(1,(2,(3,())))---->(3,(2,(1,())))
我的链表是嵌套的元组。 First(xs)返回第一个元素,在上面的示例中,它在右侧为1或3。 Rest(xs)返回右侧的所有其他元素(2,(3,()))或(2,(1,())。
我的代码如下:
empty = ()
def reversed(xs):
if xs == (first(xs), empty):
return first(xs)
else:
return reversed(rest(xs)), first(xs)
但它产生以下输出:
((3, 2), 1)
我想,我已经很接近了,但是我没有办法解决这个问题。
有人可以帮助我吗?
谢谢
答案 0 :(得分:1)
有多种方法可以执行此操作。现在,您只是将它们连接到一个新的元组,而该元组不会创建格式正确的链表。相反,您可以使用第二个功能将前一个private void ClanoviToolStripMenuItem_Click(object sender, EventArgs e)
{
Clanovi NewMDIChild = new Clanovi()
{
MdiParent = this
};
NewMDIChild.Show();
}
append
first
reversed
中移出。另外,您的基本情况似乎是错误的,因为您仅返回单个元素而不是链表。
rest
但是请注意,这具有二次复杂度O(n²),因为您必须在{{1的每一步中,将整个列表(或部分列表)迭代到def reversed(xs):
if xs == empty:
return empty
else:
return append(reversed(rest(xs)), first(xs))
def append(xs, x):
if xs == empty:
return (x, empty)
else:
return first(xs), append(rest(xs), x)
>>> reversed((1, (2, (3, (4, empty)))))
(4, (3, (2, (1, ()))))
的{{1}}节点}}函数。对于线性复杂度O(n)版本,您可以在append
函数中添加第二个参数(或者,如果不能更改签名,则可以创建第二个函数以由原始函数调用)。这将在第二个参数中建立反向列表,最后只返回该列表。
first
此外,正如评论中所指出的那样,定义递归数据结构的语言比Python更好,在Python中使用列表的方法也更好,但我将假定这只是为了学习,而不是实际用途。 >
答案 1 :(得分:0)
您可以使用简单的递归:
d = (1,(2,(3,())))
def reverse(_d, _c = ()):
a, b = _d
return (a, _c) if not b else reverse(b, (a, _c))
print(reverse(d))
输出:
(3, (2, (1, ())))