它能用递归来完成吗?

2024-05-13 05:23:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图让我的程序运行,因为我想它,但我有一些问题,希望有人能帮助它。在

我写了一个程序,它获取一个字符列表,然后将它们组合起来创建单词。当列表中有“”时,单词结束。所以看起来是这样的:

inp = ['r','e', 'e', 'l', ' ', 'y', 'e', 'l', 'l', 'o', 'w', ' ', 'g', 'e', 'l',' ', 'p','e','e','k']
outp = ['reel', 'yellow', 'gel', 'peek']

代码如下:

^{pr2}$

现在要得到输出(如果输入在上面),我需要调用mer两次。有没有办法让它运行到输入列表为空,或者使用递归?在

这只是一个编程练习,所以可能会做得更好,但现在我只需要这样。在


Tags: 代码程序程序运行列表字符单词inpmer
3条回答

我知道你要求一个使用递归的方法,但是在这种情况下,最典型的python方法是将字符连接在一起,然后拆分它们。在

outp = "".join(input).split(" ")

And now to get the output (in the case with the input like on top) i need to call mer two times.

你的算法的问题是你在迭代列表的时候修改了它。这是一件淘气又不安全的事。在

"reel"放入outp后,inp为{}。但是循环将检查的下一个字符是-至少在CPython实现中-不是'yellow''y',而是{}。这是因为迭代在内部存储一个索引(恰好与您手动更新的tail变量同步)并使用它来获取元素。为实现for循环而在幕后创建的listiterator完全不知道它所迭代的list的更改,因此无法调整以保持“相同的位置”(谁知道你的真正意思是什么呢?)。在

如果您在代码中添加两个“trace”print语句来显示变量在各个点的状态,您就可以亲眼看到这一点。在

不管怎样,在第二个空格中,{cd6}都会在第二个cd6}中找到一个{cd6},因为它会在第二个cd6}处运行,因为'gel'和{}之间的空间仍然在缓冲区中(您没有真正清楚地考虑实际的结束条件)。在

如果你真的真的很想做任何事情而不是仅仅写''.join(inp).split(' '),那么你可以通过跟踪单词的开头和结尾的索引,切片子列表,将它们连接起来并将结果单词放入输出中,只保留输入。当我们在做的时候:

  • 函数应该使用返回值来返回数据;传递一个outp参数是愚蠢的-让我们返回一个单词列表。

  • 我们可以使用内置的enumerate函数在迭代时获取与列表元素匹配的索引。

  • 我不知道“mer”是什么意思。

  • 您使用了太多的括号,与布尔文字(TrueFalse)相比,样式很差。

因此,使用原始算法更正的代码:

def words_from(chars):
    begin = 0 # index of beginning of current word
    result = [] # where we store the output
    for i, char in enumerate(chars):
        if char == ' ':
            result.append(''.join(chars[begin:i]))
            begin = i + 1
    # At the end, make one more word from the chars after the last space.
    result.append(''.join(chars[begin:]))
    return result

您可以使用joinsplit

>>> ''.join(inp).split()
['reel', 'yellow', 'gel', 'peek']

^{pr2}$

相关问题 更多 >