首页 > 解决方案 > 给定高度和值,递归生成三角形格式的列表列表

问题描述

我最近开始研究递归来清理我的代码并“完善我的游戏”。因此,我正在尝试做通常可以通过循环等简单地完成的事情,但是用递归算法来练习它们。

目前,我正在尝试生成一个二维数组,理论上它应该类似于 NxN 格式中的一种直角三角形,给定一些高度n和将返回到二维数组中的值。

例如,假设我打电话给: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 = 3value = 'a',这当前输出:[['a'], [['a'], [['a'], [['a']]]]]

现在,这不必像我上面以直角三角形形式显示的那样进行格式化或打印(这只是我想要完成的可视化)。

当然,我会回答您需要的任何澄清问题!

标签: pythonpython-3.xrecursionmultidimensional-array

解决方案


你有几个逻辑错误:off-by-1 with n,增长错误的一面(关键,非基本实现不应该使用基本大小的数组),增长错误大小的数组。固定版本:

#!/usr/bin/env python3


def my_function(n, value):
    if n <= 0:
        return []
    return my_function(n-1, value) + [[value]*n]


def main():
    print(my_function(3, 'a'))


if __name__ == '__main__':
    main()

由于您返回的是可变的,因此您可以通过使用.append而不是获得更高的效率+,这将使其不再起作用。另请注意,内部可变对象不会被复制(但由于递归是内部的,在这种情况下这并不重要)。

可以通过添加参数来编写它的尾递归版本。

但是 python 是一种使用不必要递归的奇怪语言。


推荐阅读