递归的hailstone序列(Python 3.x)返回一个平面列表

时间:2018-06-02 11:38:29

标签: python-3.x recursion

我在这里的第一篇文章,我是一名喜欢在业余时间编码的初学程序员。对逻辑/理解中任何可能的,明显的(对你)错误提前道歉。

我只是想抓住递归。了解基础案例的结构,基本原理等,抓住整体“放松”的困难。过程

我正在做一些改进的练习。

我正在研究Hailstone Sequence。我的函数很好地生成数字(除非初始输入n = 1,但在这个阶段这是一个小问题),但它应该返回一个平面列表,我能得到的最好的是一个多维数组。 / p>

我希望(如果可能的话)避免在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))

1 个答案:

答案 0 :(得分:1)

程序输出

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. 在两个递归分支中,我们返回一个列表 plus 递归调用的结果
  3. 由于我们知道hailstone始终会返回一个列表,因此我们知道[n] + hailstone(...)始终是有效的结果