繁体   English   中英

如何使用递归将两个列表添加在一起?

[英]How can I use recursion to add two lists together?

例如,说我有

a = [1, 3, 9]
b = [1, 2, 4, 5] 

我想按顺序返回一个新列表(n):

n = [1,1,2,3,4,5,9] by using recursion. 

我曾尝试使用标准递归方法执行此操作,但我的问题是,每当我在递归 function 中创建一个新列表时,它的值总是在递归调用期间再次设置为 []。 有没有办法让 n 不是 go 恢复为空?

def recur(a,b):
    if a[0] <= b[0]:
        n.append(a[0])
        return (merge(a[1:], b))

一种方法(在我的脑海中,可能有错误):

def merge_sorted(a, b):
    if not a:
        return b
    if not b
        return a

    if a[0] < b[0]:
        return [a[0]] + merge_sorted(a[1:], b)
    return [b[0]] + merge_sorted(a, b[1:])

如果学习递归是您的目标,我建议实施几个版本,并尝试自己找到一些版本。 一个版本可能与您开始的版本类似 - 在 3d 列表中返回结果(因此您需要一个 3d 参数。另一个选项是我个人不喜欢的全局)。 我的食谱总是一样的:

  1. 定义停止条件。 在上面,显然如果一个输入是空的,另一个是排序的,那么另一个确实是结果。
  2. 由此推断返回的不变量 - 在上述情况下, merge_sorted的结果返回列表的正确合并。
  3. 给定不变量,构造递归调用以减小输入的大小。

这与归纳证明非常相似(相同?)。

你可以这样做:

def recur(array):
    ret = []
    if len(array) <= 1:
        return array;
    half  = int(len(array) / 2)
    lower = recur(array[:half])
    upper = recur(array[half:])
    lower_len = len(lower)
    upper_len = len(upper)
    i = 0
    j = 0
    while i != lower_len or j != upper_len:
        if( i != lower_len and (j == upper_len or lower[i] < upper[j])):
            ret.append(lower[i])
            i += 1
        else:
            ret.append(upper[j])
            j += 1

    return ret

a = [1, 3, 9]
b = [1, 2, 4, 5]
print(a+b)           #[1, 3, 9, 1, 2, 4, 5]
print(recur(a+b))    #[1, 1, 2, 3, 4, 5, 9]
a = [1, 3, 9]
b = [1, 2, 4, 5] 
c=[]
def recurse(a,b,c):
    if len(a)==0 and len(b)==0:
        pass
    elif len(a)==0 and len(b)!=0:
        c.extend(b)
    elif len(a)!=0 and len(b)==0:
        c.extend(a)
    elif a[0]<b[0]:
        c.append(a[0])
        del a[0]
        recurse(a,b,c)
    else:
        c.append(b[0])
        del b[0]
        recurse(a,b,c)
recurse(a,b,c)

解释:

1.创建一个空列表c

2.1st If:如果'a'和'b'都为空,则递归完成

3.1st elif:如果只有'a'为空,则将'b'的所有值扩展()到'c'&递归完成

4.2nd elif:类似于 1st elif,反之亦然

5.如果两者都不为空,请检查“a”和“b”的第一个元素。 以较低者为准,append 到 'c' 并删除,递归调用 'recurse'

尽管它认为 'a' 和 'b' 都按照上面的示例进行排序

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM