在严格条件下通过递归保留信息(Python)



和我的搭档正在研究一个问题,我们需要减少数组并在部分上运行操作(在本例中为 2 个(,我们正在通过递归减少并将数组的左右两侧发送回函数。

我们让所有这些工作正常,例如,使用数组 [2, 3, 4, 5, 6, 7, 8, 9],我们得到了我们需要的所有部分。

问题是,我们需要这些片段中的每一个,然后在我们得到的下一块上运行数学运算。

因此,例如,我们重复到 [2, 3] 并将其转换为 [5, -1]。然后我们重复到 [4, 5] 并将其更改为 [9, -1] 并将它们组合成 [14, -2, -4, 0]。这是我们阵列的左侧。这很好用。然后它做右手边,它得到我们想要的答案。这很好用。

问题是我们现在需要两个部分在一起(不能使用全局变量(。我们已经被困在这里几个小时了。我们只能通过递归传递简化的数组,如果我们初始化一个数组来容纳这两个部分,它将在右侧开始时重置。

谢谢

编辑:代码:H是给定的起始矩阵,但没关系,它没有相关性,所以单元测试通过(我们可以使用它,但我们真的不知道如何(

x 的输入是 [2,3,4,5,6,7,8,9]

def hadmatmult(H, x):
 d = 0
 n = len(x)
first = 0
last = len(x)
a = [0] * math.floor(n/2)
b = [0] * math.floor(n/2)
if n == 2:
  temp1 = x[0]
  x[0] = temp1 + x[1]
  x[1] = temp1 - x[1]
else:
  mid = math.floor((first+last)/2)
  for i in range(first, mid):
    a[i] = x[i]
  hadmatmult(H, a)
  for j in range(mid, last):
    b[d] = x[j]
    d = d + 1
  hadmatmult(H, b)
  if(len(a) == 2:
    adds = [0] * len(a)
    subs = [0] * len(a)
    for t in range(0, len(a)):
      adds[t] = a[t] + b[t]
      subs[t] = a[t] - b[t]
    #alladds = alladds + adds
    #allsubs = allsubs + subs
    print(adds)
    print(subs)
输出:输出零件 [14, -2, -4,

0] 和 [30, -2, -4, 0]

如果必须递归,请以更简单的方式进行递归。剥离您需要的元素并递归其余元素。

x = [2,3,4,5,6,7,8,9]
def recurse_and_stuff(x):
    if len(x) == 0:
        # base case
        return []
    a, b, = x[:2], x[2:4]
    m,n,o,p = [a[0]+a[1], a[0]-a[1], b[0]+b[1], b[0]-b[1]]
    result = [[m+o, n+p, m-o, n-p]] + recurse_and_stuff(x[4:])
    return result
>>> x = [2,3,4,5,6,7,8,9]
>>> recurse_and_stuff(x)
[[14, -2, -4, 0], [30, -2, -4, 0]]
>>> x = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]
>>> recurse_and_stuff(x)
[[14, -2, -4, 0], [30, -2, -4, 0], [46, -2, -4, 0], [62, -2, -4, 0]]
# works for longer inputs as long as len(x) % 4 == 0

要一直向下递归:

import itertools
def do_the_needful(a,b):
    try:
        zipped = zip(a,b)
    except TypeError:
        # a and b are ints, not lists of ints
        zipped = [(a,b)]
    return itertools.chain.from_iterable(zip(*[[aa+bb, aa-bb] for aa,bb in zipped]))

def recurse_and_stuff(x):
    if len(x) == 1:
        return list(x[0])
        # if you only have to iterate through this, there's no
        # need to call `list(...)` here.
    return recurse_and_stuff([do_the_needful(x[i], x[i+1]) for i in range(0, len(x), 2)])

相关内容

  • 没有找到相关文章

最新更新