微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过递归反转列表,以便调用该函数两次返回原始列表

如何解决通过递归反转列表,以便调用该函数两次返回原始列表

我试图找到一种方法来反转列表(不是链表),以便调用函数两次返回原始列表,而只调用一次函数既不返回反转列表也不返回原始列表。第一次调用的任何其他结果都很好。 预期行为如下所示:

list1 = [0,1,2,3,4,5,6,7]
print(recReverse(list1))
> [5,7,2] # not the reversed original list or original list
print(recReverse(recReverse(list1)))
> [0,7] # original list

到目前为止我已经想出了这个函数

def recReverse(split):
if len(split) == 1:
    return split
h = len(split)//2
left = split[:h]
right = split[h:]
return recReverse(right)[::-1] + recReverse(left)[::-1]  

问题是,到目前为止,它只适用于长度为 2 的幂的列表。如果我尝试使用不同长度的列表:

list2 = [0,6]
print(recReverse(list2))
> [4,1]
print(recReverse(recReverse(list2)))
> [0,3]

我认为必须有某种方式以某种方式操纵列表,以便这应该是可能的,但我无法找到一个干净的解决方案 - 到目前为止我能做的最好的是一个“接近”的列表原始的,同时将“噪音”添加到结果列表中。我想找到一个在第二次调用时返回完全相同列表的进程。

解决方法

无论如何,复杂性将是线性的。为什么不简单:

def recReverse(split):
    if split:
        return recReverse(split[1:]) + split[:1]
    return split

这也将反转逻辑留给您的函数,并且不使用内置的 step -1 反转函数,只是添加了虚假噪声。

,

为什么不用两个单独的编码和解码函数,而不是同一个函数来完成这两个操作?

为什么函数必须是递归的?如果您有一个函数可以执行您想要的操作但不是递归的,那么您的图像处理是否不起作用?

什么构成了充分的“编码”?到目前为止,我们所知道的不是原始列表,也不是反向列表。如果该函数只是交换列表中的两个条目而将其他所有条目保留在原位怎么办?这直观上不是一个好的“编码”,但到目前为止它满足要求。

这种编码的目的是什么?你没有压缩。您是否试图以加密方式保护图像?您最好将密码学留给专家。

这是一个函数,它接受一个列表,返回一个既不是原始列表也不是反向列表的结果,并在调用两次时返回原始列表。您也不会喜欢这个,因为它只是反向列表移动了一些数量,可能没有为您充分编码。

def shift(input,amount):
    # Shift a list to the right
    return inp[-amount:] + inp[:-amount]

def recReverse(split,shift_amount):
    split = shift(split,shift_amount)
    split = split[::-1]
    split = shift(split,-shift_amount)
    return split

这里有一个你可能更喜欢:

import random

def recReverse(split):
    random.seed(0)
    half_len = len(split)//2
    index_map = [x for x in range(half_len)]
    random.shuffle(m)
    for indx,pos in enumerate(index_map):
        split[indx + half_len],split[pos] = split[pos],split[indx + half_len]
    return split  

该函数“随机”将列表前半部分的元素与列表后半部分的元素交换。它并不是真正的随机,因为我们每次都以相同的方式随机播种,这使得它是可逆的。如果您试图加密您的图像,这会很糟糕。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。