python-3.x - 递归冰雹序列(Python 3.x)返回一个平面列表
问题描述
我在这里的第一篇文章,我是一个喜欢在业余时间编码的初学者程序员。对于逻辑/理解中任何可能的、明显的(对您而言)错误,请提前道歉。
我只是想掌握递归。了解结构、基本案例的基本原理等,掌握整个“展开”过程的一些困难。
我正在做一些练习来提高。
我现在正在研究冰雹序列。我的函数可以很好地生成数字(除非初始输入 n = 1,但在这个阶段这是一个小问题)但它应该返回一个平面列表,而我能得到的最好的是一个多维数组。
我想(如果可能的话)避免编写一个单独的函数或在 Hailstone 函数之外编写任何代码,这些代码会继续“展平”列表。
到目前为止我的代码。请帮忙!
def hailstone(n):
if n ==1:
return n
else:
if n%2 == 0:
return [n] + [hailstone(n//2)]
else:
return [n] + [hailstone(3*n+1)]
n = int(input())
print(hailstone(n))
解决方案
程序的输出
print(hailstone(5))
# [5, [16, [8, [4, [2, 1]]]]]
预期产出
print(hailstone(5))
# [5, 16, 8, 4, 2, 1]
你的程序很好,接近预期的结果。问题是,在您对 的递归调用中hailstone
,您将结果包装在[]
. 相反,始终返回[n]
并可选择连接序列中的附加项
def hailstone(n):
if n ==1:
return [n] # always wrap n in []
else:
if n%2 == 0:
return [n] + [hailstone(n//2)] # do not wrap here
else:
return [n] + [hailstone(3*n+1)] # do not wrap here
if/else->if/else 通常会写成elif
使用
def hailstone(n):
if n == 1:
return [n]
elif n % 2 == 0:
return [n] + hailstone (n // 2)
else:
return [n] + hailstone (3 * n + 1)
print (hailstone (5))
# [5, 16, 8, 4, 2, 1]
为了了解它是如何工作的,我们查看hailstone
并注意每个return
分支......
- 每个分支总是返回一个列表
- 在两个递归分支中,我们返回一个列表加上递归调用的结果
- 因为我们知道
hailstone
总是返回一个列表,所以我们知道这[n] + hailstone(...)
总是一个有效的结果
推荐阅读
- r - 重新聚合数据——从粗略到精细的时间分辨率
- heroku - 超出 Heroku slug 大小
- amazon-web-services - 无法从 AWS 获取身份验证令牌
- linux - 使用 eBPF 测量系统调用引起的 CPU 模式切换开销
- android - 卡在运行 Gradle 任务 'assembleDebug'
- mysql - mysql在对某些表的查询时崩溃
- c++ - 读取透明图像 boost.gil C++
- swiftui - 如何创建只有字母、空格键和逗号的自定义键盘?
- c# - 如何在 Linq 中使用 distinct 和 count ?
- python - 重塑和查看 Numpy ndarray 数据所有权问题