浏览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)
?
答案 0 :(得分:0)
Python字符串是immutable,这意味着通过一次迭代一次迭代来构造一个长字符串,每次演变都会使字符串的实例加倍。虽然较早的演变可能是垃圾收集,但从概念上讲,这在空间方面仍然不如附加到列表中。
要生成字符串1113213211
,将创建所有这些实例:
11
1113
111321
11132132
1113213211
然而,正如作者所做的那样,生成列表将是:
['11', '13', '21', '32', '11']
(顺便说一下,在这个例子中,函数look_and_say
调用它的内部函数next_number
。这不是递归。这是一个递归,其中一个函数必须自称。)