python - 给定高度和值,递归生成三角形格式的列表列表
问题描述
我最近开始研究递归来清理我的代码并“完善我的游戏”。因此,我正在尝试做通常可以通过循环等简单地完成的事情,但是用递归算法来练习它们。
目前,我正在尝试生成一个二维数组,理论上它应该类似于 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 = 3
和value = 'a'
,这当前输出:[['a'], [['a'], [['a'], [['a']]]]]
现在,这不必像我上面以直角三角形形式显示的那样进行格式化或打印(这只是我想要完成的可视化)。
当然,我会回答您需要的任何澄清问题!
解决方案
你有几个逻辑错误: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 是一种使用不必要递归的奇怪语言。
推荐阅读
- angular - Angular - Value lost when call function
- android - 更改背景图像的颜色
- javascript - 如何将单个 JSON 对象拆分为一个 JSON 嵌套数组?
- python - 解析xml文件的目录并将数据封装在多个数组中
- kotlin - 在调用过程中使用 OkHttp 访问底层 TCP 流
- sql - Updating a row to be based on a transformation of another row (Oracle)
- policy - Sending XACML request with multiple values in bag to be evaluated by policy
- android - 编辑请勿打扰设置
- python-3.x - Code does not execute due to time out - How to optimize it
- c# - 哪个框架是开发支持多平台、Windows、Linux、Android 和 iOS 手机的 UI 的最佳框架?