Рекурсивная функция умирает с ошибкой памяти

Допустим, у нас есть функция, которая переводит символы Морзе:

  • . -> -.
  • --> ...-

Если мы применим эту функцию дважды, мы получим, например:

. -> -. -> ...--.

Учитывая входную строку и количество повторений, нужно узнать длину конечной строки. (Задача 1 из Фламандского соревнования по программированиюVPW, взята из этих слайдов, которые обеспечивают решение на Haskell).

Для данного входного файла

4
. 4
.- 2
-- 2 
--... 50

Мы ожидаем решения

44
16
20
34028664377246354505728

Поскольку я не знаю 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))

Комментарии по стилю и дальнейшим улучшениям приветствуются

6
задан iCodez 21 January 2015 в 18:26
поделиться