递归地反转一个字符串?

时间:2017-04-05 04:32:59

标签: python recursion

所以这段代码反转了一个字符串:

def backward(text):
if text == "":
    return text
else:
    return text[-1] + backward(text[:-1])

我不明白的是如何做。如果文本是[1,2,3,4,5],则取消其他语句返回5 1 2 3 4(因为[-1]是5而[:-1]是1 2 3 4?我真的不知道如何调用向后函数来反转[:-1]部分。正如你所看到的,我真的很难处理递归问题。你能给我的任何帮助都会非常感激。谢谢! / p>

3 个答案:

答案 0 :(得分:5)

在递归达到最终表达之前,它们不会立即相加。在这里,每一步都发生了什么:

"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"

基本上你正构建一个返回语句链(又名call stack),它们最后连接成“54321”。

在上面的计算中,我省略了return个关键字。对于例如"5" + "4" + backwards("123")在现实中看起来像return "5" + (return "4" + backwards("123"))

答案 1 :(得分:1)

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

当你处理递归的东西时,它有助于不过度思考它。我知道大多数编程都要求您理解代码的每个细微差别,但递归是不同的。如果你试着通过一个递归函数的调用堆栈来思考,你就会感到困惑。人的大脑不像电脑。在我们失去赛道之前,我们的筹码只能达到三个等级。

因此,对于这个问题,您想要考虑它的方式是这样的:

  

"要反转字符串,只需取最后一个字符并将其放入   其余字符的可逆版本的开头。"

这似乎是一个无意义的陈述,因为它是根据自身来定义的,但这恰恰是递归,一个根据自身定义的函数。

因此,对于您的问题,text[-1]会为您提供列表中的最后一项,text[:-1]会为您提供剩余的字符。

例如,如果您的列表是[1, 2, 3, 4],那么评估每个递归调用将会是这样的:

backwards([1, 2, 3, 4])

评估为

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看起来像这样:

def sum(a):
    if len(a) == 0:
        return 0
    else:
        return a[0] + sum(a[1:])

答案 2 :(得分:0)

此代码的工作原因是由于您处理它的方式。正如您所正确观察到的那样, 'class' => 'kartik\grid\DataColumn', 'attribute' => 'city_id', 'label' => 'City', 'hAlign' => 'center', 'vAlign' => 'middle', 'width' => '70px', 'filterType' => GridView::FILTER_SELECT2, 'filter' => [ 1 => 'filter 1', 2 => 'filter 2', ], 'format' => 'html', 'value' => function($data){ $cities = \app\models\City::getData(); if(isset($cities[$data->city_id])){ return $cities[$data->city_id]; } return $data->city_id; } 将是字符串的其余部分,而不是最后一个元素。

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

text[:-1]

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