试着写一个python递归函数

时间:2016-04-06 15:04:48

标签: python recursion

我有以下列表:

list = ['ABC', 'DEF', 'GHI']

编写递归函数的最佳方法是从每组三个中选择一个字母并返回所有可能的组合/排列:

E.g。输出如下:

  

A,AD,ADG,ADH,ADI,AEG,AEH,AEI,AFG,AFH,AFI

     

B,BD,BDG,BDH,BDI,BEG,BEH,BEI,BFG,BFH,BFI

     

C,CD,CDG,CDH,CDI,CEG,CEH,CEI,CFG,CFH,CFI

     

D,DG,DGA,DGB,DGC,DHA,...等......

我学习递归函数。到目前为止,我已经连续7个小时处理这个问题而且还远未到来。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:2)

考虑到对于空列表,您的结果是一个空列表(这是您的“基本情况”),即

f([]) == ""

对于任何非空列表,您将获取第一个列表元素的每个字符(列表的“头部”),并将其添加到通过递归地将函数应用于余数(“尾部”)返回的每个字符串中。列表(这是你的'递归案例'):

f(['ABC'])
  == 'A' + f([]), 'B' + f([]), 'C' + f([])
  == 'A' + '', 'B' + '', 'C' + ''
  == 'A', 'B', 'C'

f(['ABC', DEF'])
  == 'A' + f(['DEF']), 'B' + f(['DEF']), 'C' + f(['DEF'])
  == 'A' + 'D' + f([]), 'A' + 'E' + f([]), 'A' + 'F' + f([]), 'B' + 'D' + f([]) ...
  == 'AD', 'AE', 'AF', 'BD', 'BE', 'BF', 'CD', 'CE', 'CF'

在Python中,这可以表示为(有些低效和冗长,但重点是显示算法):

def f(xs):
    if not xs:
        yield ''
    else:
        head = xs[0]
        tail = xs[1:]

        for char in head:
            yield char
            for s in f(tail):
                yield char + s

将此功能称为

print list(f(['ABC', 'DEF', 'GHI']))

打印

['A', 'AD', 'ADG', 'ADG', 'ADH', 'ADH', 'ADI', 'ADI', 'AE', 'AEG', 'AEG', 'AEH', 'AEH', 'AEI', 'AEI', 'AF', 'AFG', 'AFG', 'AFH', 'AFH', 'AFI', 'AFI', 'B', 'BD', 'BDG', 'BDG', 'BDH', 'BDH', 'BDI', 'BDI', 'BE', 'BEG', 'BEG', 'BEH', 'BEH', 'BEI', 'BEI', 'BF', 'BFG', 'BFG', 'BFH', 'BFH', 'BFI', 'BFI', 'C', 'CD', 'CDG', 'CDG', 'CDH', 'CDH', 'CDI', 'CDI', 'CE', 'CEG', 'CEG', 'CEH', 'CEH', 'CEI', 'CEI', 'CF', 'CFG', 'CFG', 'CFH', 'CFH', 'CFI', 'CFI']

答案 1 :(得分:0)

以下程序应该接近您的要求。您可能需要调整代码以提高效率并对其生成的值进行排序。请注意,递归函数嵌入在possibilities中,并最终根据需要在各个级别调用自身。

def main():
    for value in possibilities('ABC', 'DEF', 'GHI'):
        print(value)


def possibilities(*args):
    if len(args) < 2:
        raise ValueError('at least two arguments must be given')
    if any(not isinstance(arg, str) for arg in args):
        raise TypeError('all arguments must be strings')
    if any(not arg for arg in args):
        raise ValueError('strings must have at least one character')
    matrix = [[''] + list(arg) for arg in args]

    def recursive_function(array):
        for index in range(len(array)):
            row = array.pop(index)
            if array:
                for column in row:
                    for next_item in recursive_function(array):
                        yield column + next_item
            else:
                yield from row
            array.insert(index, row)

    def unique(iterator):
        values = {''}
        for value in iterator:
            if value not in values:
                values.add(value)
                yield value
    return sorted(unique(recursive_function(matrix)))


if __name__ == '__main__':
    main()