【发布时间】:2014-06-03 08:05:31
【问题描述】:
我正在尝试完成我在实现记忆化方面的第一个练习,但我不知道如何解决这个问题:
我有一个函数可以将输入文本包装成指定的行长,然后打印结果。
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,
这显然是错误的。看起来我的“记忆”版本唯一要做的就是将最终输出附加到其他所有输出。所以,我认为我对如何为这个函数实际实现记忆的理解完全不正确。有人可以指出我正确的方向吗?
【问题讨论】:
-
顺便说一下,这个函数并不特别适合记忆。记忆对dynamic programming 特别有用,您可以在其中一遍又一遍地进行相同的递归调用。在那里,它可以将指数时间算法变成线性时间。在这里,递归没有利用备忘录,我不知道你是否可能会尝试重复换行相同的文本。 (也许你是。我想这取决于应用程序。)
标签: python algorithm recursion memoization