自动换行算法不按预期打印

时间:2014-06-03 06:34:40

标签: python algorithm recursion word-wrap

我想开发一种递归自动换行算法,它采用指定的字符串和换行长度(一行上的最大字符数)来返回输入长度的换行输出。我不想让它分开单词。例如,长度为20的This is the first paragraph that you need to input返回为:

This is the first
paragraph that you
need to input

但是,我的功能目前正在打印:

This is the first paragraph
that you need to input

我的代码:

def wrap(text, lineLength):

    temp=text.find(" ",lineLength-1)
    if temp == -1:
        return text
    else:
        return text[:temp+1]+'\n'+wrap(text[temp+1:], lineLength)

print wrap("This is the first paragraph that you need to input", 20);

为什么没有按照我的预期做到这一点,我该如何解决?

4 个答案:

答案 0 :(得分:3)

您的代码可以进行一些更改:

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

使用此输出:

This is the first 
paragraph that you 
need to input

但是,如果没有空间可以破解,你可能还想要强制执行:

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

print wrap("Thisisthefirstparagraphthatyouneed to input", 20)

这导致:

Thisisthefirstparag-
raphthatyouneed to 
input

答案 1 :(得分:1)

您正在使用find并将start参数设置为19,这意味着您可以在第20个字符后找到第一个空格。你想要的是在第20个字符之前找到 last 空间。请改为使用rfind

答案 2 :(得分:0)

如果没有完全理解你正在使用哪个wordwrap算法,我怀疑这个问题很简单:

temp=text.find(" ",lineLength-1)
if temp == -1:
    return text

如果在第一个lineLength-1字符中找不到空格,则只需逐字返回文本。你不需要在那里或其他东西进行递归吗?

答案 3 :(得分:0)

def wrap(str,l):     
    ll=list(str)
    i=l
    while i < len(str):
        ll.insert(i,"\n")
        i=i+l
    nstr="".join(ll)
    print nstr

输出: 这是第一个pa

你是否

输入