编程访谈的要素 - 看,说

时间:2018-05-19 15:57:52

标签: python algorithm

浏览Elements of Programming Interviews并查看以下问题:

  

在Look-and-say(或Count and Say)序列中找到第n个术语。 look-and-say序列是以下整数的序列:   1,11,21,1211,111221,312211,13112221,1113213211,......

作者的解决方案如下:

def look_and_say(n):
  def next_number(s):
    result, i = [], 0 
    while i < len(s):
      count = 1 
      while i + 1 < len(s) and s[i] == s[i + 1]:
        i += 1 
        count += 1
      result.append(str(count) + s[i])
      i += 1 
    return ''.join(result)

  s = '1'
  for _ in range(1, n):
     s = next_number(s)
  return s

这是我的问题:递归调用,发生O(2^N)次,生成一个数组和一个字符串。我理解这只是空间成本中的一个常数因素,但使用递归函数构建列表并不是更有效,然后返回return s而不是''.join(s)

1 个答案:

答案 0 :(得分:0)

Python字符串是immutable,这意味着通过一次迭代一次迭代来构造一个长字符串,每次演变都会使字符串的实例加倍。虽然较早的演变可能是垃圾收集,但从概念上讲,这在空间方面仍然不如附加到列表中。

要生成字符串1113213211,将创建所有这些实例:

11
1113
111321
11132132
1113213211

然而,正如作者所做的那样,生成列表将是:

['11', '13', '21', '32', '11']

(顺便说一下,在这个例子中,函数look_and_say调用它的内部函数next_number。这不是递归。这是一个递归,其中一个函数必须自称。)