假设我们有一个转换莫尔斯符号的函数:.->;-.
-->;...-
如果我们应用这个函数两次,我们得到的结果是:
.->;-.->;...--.
给定一个输入字符串和多次重复,想知道最后一个字符串的长度。(问题1来自Flemish Programming ContestVPW,取自these slides,它在Haskell中提供了一个解决方案)。在
对于给定的输入文件
^{1}$
我们期待解决方案
^{pr2}$
因为我不认识Haskell,这是我用Python编写的递归解决方案:def encode(msg, repetition, morse={'.': '-.', '-': '...-'}):
if isinstance(repetition, str):
repetition = eval(repetition)
while repetition > 0:
newmsg = ''.join(morse[c] for c in msg)
return encode(newmsg, repetition-1)
return len(msg)
def problem1(fn):
with open(fn) as f:
f.next()
for line in f:
print encode(*line.split())
它适用于前三个输入,但在最后一个输入时会出现内存错误。在
你如何以更有效的方式重写这篇文章?在
编辑
根据给出的评论重写:def encode(p, s, repetition):
while repetition > 0:
p,s = p + 3*s, p + s
return encode(p, s, repetition-1)
return p + s
def problem1(fn):
with open(fn) as f:
f.next()
for line in f:
msg, repetition = line.split()
print encode(msg.count('.'), msg.count('-'), int(repetition))
对风格和进一步改进的意见仍然受到欢迎