我正在尝试编写一个快速脚本来输出序列。 序列开始如下: 1,11,21,1211,111221,312211 ... 从1开始,然后作为1 1,第二个术语是11,因为两个1s的第三个术语是21的等等。
我在下面写了一个脚本,输出了这个序列中的术语。 当input_string为1时,它输出正确的下一个术语,即11.但是之后的所有术语也输出为11 .....如果我手动将输入设置为11,那么所有术语都会正确计算。
这没有任何意义,因为"1"
我的total_sequence[0]
变量的初始输入将为"1"
,正确输出"11"
。
然后,下一个术语将以total_sequence[1]
作为其输入,即"11"
,即最后一次迭代输出。
但是这会将"11"
作为输出。
如果我直接将"11"
作为total_sequence [1]术语而不是引用total_sequence[1]
(其中= "11"
),则会给出正确的输出。
所以基本上为什么input_string = "11"
与output[1]
的{{1}}不同?
output = ["1","11"]
答案 0 :(得分:2)
您在循环体中使用input_string
,但永远不会更改,它始终是第一个字符串,在您的示例"1"
中。
可能用以下内容更改内循环的第一行:
input_string = total_sequence[i]
for current_char in input_string:
应该足够了,但我没有测试它。
答案 1 :(得分:0)
这被称为“外观和说法”序列;可以使用itertools.groupby
:
from itertools import groupby
def look_and_say(n):
"""
Generate the first `n` terms of the sequence
'1', '11', '21', '1211', ...
"""
if n < 1:
return
# first term
term = "1"
yield term
# second through `n`th terms
for term_num in range(1, n):
chars = []
for ch,reps in groupby(term):
count = len(list(reps))
chars.append(str(count))
chars.append(ch)
term = "".join(chars)
yield term
然后
N = 5
print(list(look_and_say(N)))
给出
['1', '11', '21', '1211', '111221']
有趣的奖励:证明序列永远不会包含高于3的数字。