这种递归组合生成算法(Python3)有问题吗?
尝试在列表“looper”中生成所有可能的值组合,使其达到用户指定的最大字符长度。为此,我尝试了一种递归算法,并得出如下结果:这种递归组合生成算法(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
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
return1
您一直拒绝合理的建议——这都是关于递归调用的返回值。您不能在一个递归框架中更改变量,而假设它们在其他框架中也会更改。如果我正确理解了潜在的问题,你会让问题变得更加困难:
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就是这样执行的)