这种递归组合生成算法(Python3)有问题吗?

这种递归组合生成算法(Python3)有问题吗?,python,recursion,Python,Recursion,尝试在列表“looper”中生成所有可能的值组合,使其达到用户指定的最大字符长度。为此,我尝试了一种递归算法,并得出如下结果: def generate_combinations(length, num_times, first_time): looper = ['1', '2', '3','4'] if num_times == 0 and first_time: word_list = [] word = '' elif num_tim

尝试在列表“looper”中生成所有可能的值组合,使其达到用户指定的最大字符长度。为此,我尝试了一种递归算法,并得出如下结果:

def generate_combinations(length, num_times, first_time):
    looper = ['1', '2', '3','4']
    if num_times == 0 and first_time:
        word_list = []
        word = ''
    elif num_times == 0:
        word = ''
    elif num_times == length and len(word_list) == 4 ** length:
        return word_list    
    else:
        for letter in looper:
            word += letter
            num_times +=1
            if num_times == length:
                word_list.append(word)
                generate_combinations(length, 0, False)
                
            else:
                generate_combinations(length, (num_times), False)
出于某种原因,无论何时运行,它都会返回值
None


我无法用我的代码识别问题,如果有人能识别,我将不胜感激。

您完全忽略了递归调用的返回

以下面的斐波那契为例:

def fib(n):
如果n>>fib(1)
1.
因为
1
小于或等于
1
。函数接受第一次返回

fib(2) 1.
2
大于
1
,因此我们必须选择第二条路径。获取
1的
fib
2-1
)和
0的
fib
2-2

由于这两个调用都是递归的,我们需要重复两次,一次用于
1
,另一次用于
0
。(这样做,这就是递归)


完成后,返回并添加结果。第一个结果是
1
,第二个结果是
0
1+0=1
return
1

您一直拒绝合理的建议——这都是关于递归调用的返回值。您不能在一个递归框架中更改变量,而假设它们在其他框架中也会更改。如果我正确理解了潜在的问题,你会让问题变得更加困难:

def generate_combinations(length):
    looper = ['1', '2', '3', '4']

    if length == 1:
        return looper

    word_list = []

    if length == 0:
        return word_list

    for suffix in generate_combinations(length - 1):
        for letter in looper:
            word_list.append(letter + suffix)

    return word_list

print(generate_combinations(3))
让递归完成这项工作

输出

% python3 test.py
['111', '211', '311', '411', '121', '221', '321', '421', '131', '231', '331', '431', '141', '241', '341', '441', '112', '212', '312', '412', '122', '222', '322', '422', '132', '232', '332', '432', '142', '242', '342', '442', '113', '213', '313', '413', '123', '223', '323', '423', '133', '233', '333', '433', '143', '243', '343', '443', '114', '214', '314', '414', '124', '224', '324', '424', '134', '234', '334', '434', '144', '244', '344', '444']
%

您忘记了递归调用和某些if条件中的
return
。@PedroRodrigues是否需要在递归调用和所有if条件中包含return语句?代码设计为在运行结束时返回一个组合列表,一旦生成了所有组合(len(word_list)==len(looper)**length),因此在我看来,它可能会干扰函数的正确功能。是的。当然如果函数没有找到return语句,它将返回
None
。在更简单的例子中尝试一下。但是它确实返回了。elif num_times==length和len(单词列表)==4**length:在有人嘲笑我之前返回单词列表。是的,这是一个效率极低的算法。但是,该算法仅用于返回一个包含所有生成组合的类型列表(word_list)值。该值在生成所有组合后返回。调用
fib(10)
返回第十个斐波那契数。不是其他的。我已经用函数的逐步执行更新了示例。你可以自己用一张纸来手工记录变量,每次你发现一个递归调用时,就得到另一张纸。(python就是这样执行的)