首页 > 解决方案 > 递归冰雹序列(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))

标签: python-3.xrecursion

解决方案


程序的输出

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分支......

  1. 每个分支总是返回一个列表
  2. 在两个递归分支中,我们返回一个列表加上递归调用的结果
  3. 因为我们知道hailstone总是返回一个列表,所以我们知道这[n] + hailstone(...)总是一个有效的结果

推荐阅读