Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 递归地反转字符串?_Python_Recursion - Fatal编程技术网

Python 递归地反转字符串?

Python 递归地反转字符串?,python,recursion,Python,Recursion,因此,此代码反转字符串: def backward(text): if text == "": return text else: return text[-1] + backward(text[:-1]) 我不明白的是怎么做。如果文本是[1,2,3,4,5],else语句不会返回51234,因为[-1]是5,[:-1]是1234吗?我真的不明白调用backward函数如何反转[:-1]部分。正如你所看到的,我真的很难做到递归。如果您能在这方面给我任何帮助,我将不胜感激。谢谢大

因此,此代码反转字符串:

def backward(text):
if text == "":
    return text
else:
    return text[-1] + backward(text[:-1])
我不明白的是怎么做。如果文本是[1,2,3,4,5],else语句不会返回51234,因为[-1]是5,[:-1]是1234吗?我真的不明白调用backward函数如何反转[:-1]部分。正如你所看到的,我真的很难做到递归。如果您能在这方面给我任何帮助,我将不胜感激。谢谢大家!

文本[-1]和文本[:-1]所给出的内容是正确的。我认为你会被它的递归方面绊倒,这是一个棘手的部分

当你在处理递归的东西时,不要想得太多。我知道大多数编程都要求您理解代码的每一个细微差别,但递归是不同的。如果您试图在头脑中仔细思考递归函数的调用堆栈,您只会感到困惑。人脑不像计算机。在我们迷失方向之前,我们的堆栈只能达到大约三层的深度

因此,对于这个问题,您想要思考的方式如下:

backwards([1, 2, 3, 4])
def sum(a):
    if len(a) == 0:
        return 0
    else:
        return a[0] + sum(a[1:])
要反转字符串,只需将最后一个字符置于 其余字符的还原版本的开头

它看起来像一个无意义的语句,因为它是根据自身定义的,但这正是递归的含义,一个根据自身定义的函数

对于您的问题,文本[-1]给出列表中的最后一项,文本[:-1]给出剩余字符

例如,如果您的列表为[1,2,3,4],则对每个递归调用的求值结果如下:

backwards([1, 2, 3, 4])
def sum(a):
    if len(a) == 0:
        return 0
    else:
        return a[0] + sum(a[1:])
评估为

4 + backwards([1, 2, 3])
4 + 3 + backwards[1, 2])
4 + 3 + 2 + backwards([1])
4 + 3 + 2 + 1
评估结果是

4 + backwards([1, 2, 3])
4 + 3 + backwards[1, 2])
4 + 3 + 2 + backwards([1])
4 + 3 + 2 + 1
评估结果是

4 + backwards([1, 2, 3])
4 + 3 + backwards[1, 2])
4 + 3 + 2 + backwards([1])
4 + 3 + 2 + 1
评估结果是

4 + backwards([1, 2, 3])
4 + 3 + backwards[1, 2])
4 + 3 + 2 + backwards([1])
4 + 3 + 2 + 1
当我第一次回答这个问题时,我认为你列出的函数不起作用,你需要一个起作用的函数,所以我很快就把它组合起来。当我写这篇文章时,我把上面列出的引文输入到我的文本编辑器中,然后写出python代码,它看起来就像你发布的那个。我并没有在脑海中一步一步地完成每一个调用,我只是输入了这个句子,然后编写了一些代码来实现这个句子

递归需要一些时间来适应,但一旦你学会了如何递归地思考,你就可以把它应用到各种各样的问题上

另一个可能更直截了当的例子是一个递归函数,它对列表中的所有数字求和

sum([1, 2, 3, 4]) => 10
因此,这方面的声明将是

要对列表求和,请将列表中的第一项添加到 列表中的其余元素

python的外观如下所示:

backwards([1, 2, 3, 4])
def sum(a):
    if len(a) == 0:
        return 0
    else:
        return a[0] + sum(a[1:])
文本[-1]和文本[:-1]给出的内容是正确的。我认为你会被它的递归方面绊倒,这是一个棘手的部分

当你在处理递归的东西时,不要想得太多。我知道大多数编程都要求您理解代码的每一个细微差别,但递归是不同的。如果您试图在头脑中仔细思考递归函数的调用堆栈,您只会感到困惑。人脑不像计算机。在我们迷失方向之前,我们的堆栈只能达到大约三层的深度

因此,对于这个问题,您想要思考的方式如下:

backwards([1, 2, 3, 4])
def sum(a):
    if len(a) == 0:
        return 0
    else:
        return a[0] + sum(a[1:])
要反转字符串,只需将最后一个字符置于 其余字符的还原版本的开头

它看起来像一个无意义的语句,因为它是根据自身定义的,但这正是递归的含义,一个根据自身定义的函数

对于您的问题,文本[-1]给出列表中的最后一项,文本[:-1]给出剩余字符

例如,如果您的列表为[1,2,3,4],则对每个递归调用的求值结果如下:

backwards([1, 2, 3, 4])
def sum(a):
    if len(a) == 0:
        return 0
    else:
        return a[0] + sum(a[1:])
评估为

4 + backwards([1, 2, 3])
4 + 3 + backwards[1, 2])
4 + 3 + 2 + backwards([1])
4 + 3 + 2 + 1
评估结果是

4 + backwards([1, 2, 3])
4 + 3 + backwards[1, 2])
4 + 3 + 2 + backwards([1])
4 + 3 + 2 + 1
评估结果是

4 + backwards([1, 2, 3])
4 + 3 + backwards[1, 2])
4 + 3 + 2 + backwards([1])
4 + 3 + 2 + 1
评估结果是

4 + backwards([1, 2, 3])
4 + 3 + backwards[1, 2])
4 + 3 + 2 + backwards([1])
4 + 3 + 2 + 1
当我第一次回答这个问题时,我认为你列出的函数不起作用,你需要一个起作用的函数,所以我很快就把它组合起来。当我写这篇文章时,我把上面列出的引文输入到我的文本编辑器中,然后写出python代码,它看起来就像你发布的那个。我并没有在脑海中一步一步地完成每一个调用,我只是输入了这个句子,然后编写了一些代码来实现这个句子

递归需要一些时间来适应,但一旦你学会了如何递归地思考,你就可以把它应用到各种各样的问题上

另一个可能更直截了当的例子是一个递归函数,它对列表中的所有数字求和

sum([1, 2, 3, 4]) => 10
因此,这方面的声明将是

要对列表求和,请将列表中的第一项添加到 列表中的其余元素

python的外观如下所示:

backwards([1, 2, 3, 4])
def sum(a):
    if len(a) == 0:
        return 0
    else:
        return a[0] + sum(a[1:])

此代码之所以有效,是因为您如何处理它。正如您正确观察到的,文本[:-1]将是字符串的其余部分,没有最后一个ele 是的

这段关键代码通过将最后一个元素附加到递归结果(将最后一个元素或空字符串附加到字符串的其余部分)来操作

return text[-1] + backward(text[:-1])

这里的提示是对backward的递归调用。将文本[:-1]视为具有与任何其他字符串相同规则的另一个字符串。如果字符串为空,则返回空字符串本身;否则,您将从中获取由text[-1]表示的最后一个元素,并传递字符串的其余部分,以便在后续递归调用中处理。

此代码之所以有效,是因为您处理它的方式。正如您正确观察到的,文本[:-1]将是字符串的其余部分,不包含最后一个元素

这段关键代码通过将最后一个元素附加到递归结果(将最后一个元素或空字符串附加到字符串的其余部分)来操作

return text[-1] + backward(text[:-1])

这里的提示是对backward的递归调用。将文本[:-1]视为具有与任何其他字符串相同规则的另一个字符串。如果字符串为空,则返回空字符串本身;否则,您将从中获取由text[-1]表示的最后一个元素,并传递字符串的其余部分,以便在后续递归调用中处理。

在递归到达最终表达式之前,它们不会立即相加。以下是每一步发生的情况:

"5" + backwards("1234")
"5" + "4" + backwards("123")
"5" + "4" + "3" + backwards("12")
"5" + "4" + "3" + "2" + backwards("1")
"5" + "4" + "3" + "2" + "1" + backwards("")
"5" + "4" + "3" + "2" + "1" + ""
"54321"
基本上你正在构建一个返回语句链,它们在最末端连接成54321


在上面的计算中,我省略了返回关键字。例如,5+4+backwards123实际上看起来像return 5+return 4+backwards123。

在递归到达最终表达式之前,它们不会立即相加。以下是每一步发生的情况:

"5" + backwards("1234")
"5" + "4" + backwards("123")
"5" + "4" + "3" + backwards("12")
"5" + "4" + "3" + "2" + backwards("1")
"5" + "4" + "3" + "2" + "1" + backwards("")
"5" + "4" + "3" + "2" + "1" + ""
"54321"
基本上你正在构建一个返回语句链,它们在最末端连接成54321


在上面的计算中,我省略了返回关键字。例如,5+4+backwards123实际上看起来像return 5+return 4+backwards123。

[1,2,3,4,5]是一个列表,其反面不是5 1 2 3 4。即使它是一个字符串,它的倒数仍然不是51234,它应该是]5,4,3,2,1[。我不是这么说的-我是说文本[-1]应该是5,[:-1]应该是1234。把它们加在一起,它就是51234。我知道[:-1]是向后函数的一部分,但我不知道向后函数是如何反转的。帮助一些人理解递归的一种方法是用英语表达代码。这里是形式为s+x的字符串的反转。任何字符串s后跟字符x都是x+反转,即x移到前面,后跟字符反转的sd、 追踪递归是一个非常无用的练习,依我看。目标是递归思考。你认为这个backwardtext[:-1]做什么?[1,2,3,4,5]是一个列表,它的倒数不是51,2,3 4。即使它是一个字符串,它的倒数仍然不是51,2,3 4,它应该是]5,4,3,2,1[。这不是我说的-我说的是text[-1]应该是5和[:-1]应该是1234。把它们加在一起就是51234。我知道[:-1]是向后函数的一部分,但我不知道向后函数是如何反转的。帮助一些人理解递归的一种方法是用英语表达代码。这里是形式为s+x的字符串的反转。任何字符串s后跟字符x都是x+反转,即x移到前面,后跟字符反转的sd、 在我看来,跟踪递归是一个非常无用的练习。目标是递归地思考。你认为这个backwardtext[:-1]做什么?问题不是如何做,而是理解这个特定代码是如何工作的。问题不是如何做,而是理解这个特定代码是如何工作的。