我最近开始研究递归来清理我的代码并“提升我的游戏”。因此,我正在尝试做一些通常可以通过循环等简单地完成的事情,而是用递归算法来练习它们。
目前,我正在尝试生成一个二维数组,在给定一些高度 n
和将返回到 2D 的值的情况下,理论上应该类似于 NxN 形式的直角三角形-数组。
例如,假设我调用:my_function(3, 'a');
,n = 3
和 value = 'a'
我返回的输出应该是:[['a'], ['a', 'a'], ['a', 'a', 'a']]
[['a'],
['a', 'a'],
['a', 'a', 'a']]
其中 n
确定最外层列表中有多少列表,以及有多少元素应按升序连续出现在这些内部列表中。
目前,我的代码如下所示:
def my_function(n, value):
base_val = [value]
if n == 0:
return [base_val]
else:
return [base_val] + [my_function(n-1, value)]
不幸的是,使用我上面的示例 n = 3
和 value = 'a'
,当前输出:[['a'], [[' a'], [['a'], [['a']]]]]
现在,这不必按照我上面显示的直角三角形形式进行格式化或打印(这只是我想要完成的内容的可视化)。
当然,我会回答您需要的任何澄清问题!
最佳答案
return [base_val]
好的,对于 n == 0
,我们得到 [[value]]
。坚硬的。呃,有点。这是包含 一个 行的结果,对吧?因此,我们的基本情况条件应该是 n == 1
。
现在,让我们试试递归的情况:
return [base_val] + [my_function(n-1, value)]
我们有 [[value]]
,我们希望以 [[value], [value, value]]
结束。同样,当我们有[[value], [value, value]]
时,我们想要生成[[value], [value, value], [value, value, value]]
从它。等等。
我们的计划是现在获取一行,然后通过递归获取其余所有行,是吗?
我们将通过递归得到哪些行?答案:开始的那些,因为那些孤立的看起来仍然像三角形。
因此,我们在本地生产哪一行?答案:末尾。
因此,我们如何对结果进行排序?答:我们需要从递归调用中获取结果,并在其末尾添加一行。
我们需要包装递归调用的结果吗?答:不是,已经是列表的列表了。我们将在其末尾再添加一个列表。
我们如何生成最后一行?答案:我们需要在列表中重复
value
,n
次。嗯,这很简单。我们需要换行吗?回答:是的,因为我们想将它作为单个项目附加到递归结果中——而不是连接它的所有元素。
好的,让我们重新审视基本情况。 我们可以正确处理 n == 0
吗?是的,它作为一个请求非常有意义,所以我们应该处理它。没有行的三角形看起来像什么?好吧,它仍然是一个行列表,但其中没有任何行。所以这只是 []
。我们仍然可以将第一行附加到它上面,然后递归地进行。太好了。
让我们把它们放在一起:
if n == 0:
return []
else:
return my_function(n-1, value) + [[value] * n]
看起来 base_val
不再有用了。好吧。
我们可以用三元表达式进一步压缩:
return [] if n == 0 else (my_function(n-1, value) + [[value] * n])
关于python - 在给定高度和值的情况下递归生成三角形格式的列表列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58575610/