Python 在适当位置反转列表项的算法?

Python 在适当位置反转列表项的算法?,python,reverse,Python,Reverse,我现在正在学习CS类中的数据结构和算法效率,我创建了一个算法来返回一个新的项目列表,该列表与原始列表的顺序相反。我试图弄清楚如何使用递归在Python列表中实现这一点,但解决方案一直没有找到。这是我的密码: def reverse_list(in_list): n = len(in_list) print('List is: ', in_list) if n <= 2: in_list[0], in_list[-1] = in_list[-1], i

我现在正在学习CS类中的数据结构和算法效率,我创建了一个算法来返回一个新的项目列表,该列表与原始列表的顺序相反。我试图弄清楚如何使用递归在Python列表中实现这一点,但解决方案一直没有找到。这是我的密码:

def reverse_list(in_list):
    n = len(in_list)
    print('List is: ', in_list)
    if n <= 2:
        in_list[0], in_list[-1] = in_list[-1], in_list[0]
        return in_list
    else:
        first = [in_list[0]]
        last = [in_list[-1]]
        temp = reverse_list(in_list[1:-1])
        in_list = last + temp + first
        print('Now list is: ', in_list)
        return in_list

if __name__ == '__main__':
    list1 = list(range(1, 12))
    list2 = reverse_list(list1)
    print(list2)
def反转列表(在列表中):
n=长度(在列表中)
打印('列表为:',在列表中)

如果n你的
n你真的不想在这里使用递归,因为它不会真正简化函数调用所涉及的额外开销问题:

list3 = list(range(1, 10))
for i in range(len(list3)/2):
    list3[i], list3[len(list3)-i-1] = list3[len(list3)-i-1], list3[i]
print(list3)

如果您想使用递归来处理它,您应该在函数的每次调用中传入一个索引计数器,直到您完成了列表的一半。这将为您提供O(n/2)运行时。

在\u列表[1:-1]
在O(n)中,因此算法在O(n²)中。“一般情况”一词不适用,这里没有最好或最坏的情况。你能进一步解释一下以帮助我理解吗?谢谢:)好吧,你在做N/2=O(N)个操作,每个操作的成本都是O(N)。O(N)*O(N)=O(N^2)。顺便说一句,我喜欢你的算法。唯一的问题是Python中的切片创建了一个副本,Python不是尾部递归的。你可以说这是Python的一个缺点,而不是你的算法。我认为op可能把
.reverse
称为“一般情况”。如果是这样的话,我相信pythons的反向函数确实在O(n)处运行。我在考虑这个问题,创建第一个索引和最后一个索引,每次都会移动,这样我就可以保持相同的列表。这或多或少就是你说的那条赛道吗?@flybonzai:就是那条!在这些练习中,“使用递归”通常意味着“找到一种方法来获取问题的一个实例,并将其转化为同一问题的一个稍小的实例”。