需要帮助了解如何实现memoization

时间:2014-06-03 08:05:31

标签: python algorithm recursion memoization

我正在努力完成第一次实施备忘录的练习,而我无法解决如何解决这个问题:

我有一个函数将输入文本包装到指定的行长度,然后打印结果。

def wrap(input, lineSpaces):
    if len(input) <= lineSpaces:
        return input
    temp = input.rfind(" ", 0, lineSpaces - 1)
    if temp == -1:
        return input
    else:
        return input[:temp+1]+'\n'+wrap(input[temp+1:], lineSpaces)

# I/O
list = []
M = int(raw_input())
for i in xrange(0, M):
    lineSpaces = int(raw_input())
    input = raw_input()
    list.append(wrap(input, lineSpaces))

for i in list:
    print i+"\n"

我目前正在尝试记忆:

def wrap(input, lineSpaces):
    if len(input) <= lineSpaces:
        return input
    temp = input.rfind(" ", 0, lineSpaces - 1)
    if temp == -1:
        return input
    else:
        return input[:temp+1]+'\n'+wrap(input[temp+1:], lineSpaces)

# I/O
inputList = []
lineSpacesList = []
unmemoizedOutput = []
M = int(raw_input())
memo = {}

for i in xrange(0, M):
    lineSpacesList.append(int(raw_input()))
    inputList.append(raw_input())
    unmemoizedOutput.append(wrap(inputList[i], lineSpacesList[i]))

for i in unmemoizedOutput:
    if not i in memo:
        for j in xrange(0, M):
            memo[i] = i + wrap(inputList[j], lineSpacesList[j])
    print memo[i]+"\n"

我没有得到我想要的输出。当我输入:

3
20
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. A
30
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cu
36
Lorem ipsum dolor sit amet,

我明白了:

Lorem ipsum dolor 
sit amet, 
consectetuer 
adipiscing elit. ALorem ipsum dolor sit amet,

Lorem ipsum dolor sit amet, 
consectetuer adipiscing 
elit. Aenean commodo ligula 
eget dolor. Aenean massa. CuLorem ipsum dolor sit amet,

Lorem ipsum dolor sit amet,Lorem ipsum dolor sit amet,

这显然是错误的。看起来我的“memoized”版本正在做的唯一事情就是将最终输出附加到其他所有输出。所以,我认为我对如何实际实现这个函数的memoization的理解完全没有了。有人可以指出我正确的方向吗?

1 个答案:

答案 0 :(得分:3)

在实现函数时,您会执行Memoization,而不是在使用它时。生成输出时,记录此调用的输入对应于您生成的输出。当你接到一个电话时,你会检查你收到的输入是否已经存储了输出,如果你有输入,你可以使用存储的输出。它看起来像这样:

_memodict = {}
def memoized_function(input):
    try:
        return _memodict[input]
    except KeyError:
        # do what you would have normally done
        _memodict[input] = output
        return output

或者像这样:

import functools
def memoize(function):
    _memodict = {}

    # This decorator just makes the new function look a bit nicer
    @functools.wraps(function)
    def wrapped(*args):
        try:
            return _memodict[args]
        except KeyError:
            output = _memodict[args] = function(*args)
            return output
    return wrapped

@memoize
def function(input):
    # Exactly what you would have written normally
相关问题