我对Javascript比较陌生。我从概念上理解递归并看到它的价值。但是,我发现自己对实际发生的事情有点困惑。我知道这不是扭转字符串的最简单方法。但我用它作为一个简单的例子
function reverse(str){
if (str === ""){
return "";
} else {
return reverse(str.substr(1)) + str.charAt(0);
}
}
所以怎么样就像"你好"成为" olleh"当代码告诉我们递归地将第一个字符放在字符串的最末端时(elloh)?希望我的问题有道理。提前致谢
答案 0 :(得分:4)
此函数将给定字符串的第一个字符串放在' return'的末尾。声明。 之后,通过删除旧字符串的第一个字符并再次执行相同的操作来递归调用该函数。迭代看起来像这样:
输入Word:' hello'
first iteration: return reverse('ello') + 'h' // returned word until now: 'h'
second iteration: return reverse('llo') + 'e' // returned word until now: 'eh'
third iteration: return reverse('lo') + 'l' // returned word until now: 'leh'
fourth iteration: return reverse('o') + 'l' // returned word until now: 'lleh'
fifth iteration: return reverse('') + 'o' // returned word until now: 'olleh'
sixth iteration: return '' // loop finished and returned word is 'olleh'
希望这有帮助
答案 1 :(得分:2)
递归函数有两种情况:基本案例和递归案例。这里,基本情况为if (str === ""){ return ""; }
,递归情况为return reverse(str.substr(1)) + str.charAt(0)
。
考虑实际的基本情况:reverse("")
生成""
。这很容易!
现在让我们考虑第二个最简单的案例:reverse("c")
。这会导致reverse(str.substr(1)) + str.charAt(0)
成为reverse("") + "c"
,我们可以很容易地看到"c"
。
接下来,reverse("bc")
。在这种情况下,表达式reverse(str.substr(1)) + str.charAt(0)
变为reverse("c") + "b"
。我们从上面知道reverse("c")
只是"c"
。因此,我们发现reverse("c") + "b"
是"cb"
。
最后,让我们逐渐理解reverse("abc")
。这里,递归的情况是reverse("bc") + "a"
。我们怎样才能弄清reverse("bc")
是什么?我们做了!依靠刚刚给出的解释,我们知道reverse("bc")
为"cb"
,因此reverse("bc") + "a"
为"cba"
。
答案 2 :(得分:1)
致电reverse("hello")
递归调用是
Function Call Returning string
return reverse(str.substr(1)) + str.charAt(0);
每一步都遵循
Recursive Calls Returning strings
reverse("ello") + "h";
reverse("llo") + "e"
reverse("lo") + "l"
reverse("o") + "l"
reverse("") + "o"
不再有递归返回子解决方案
+ "h";
+ "e"
+ "l"
+ "l"
+ "o"
-----------------------------
"o"+"l"+"l"+"e"+"h" = "olleh" ("hello" reversed)
答案 3 :(得分:0)
我明白了。因此,它会从字符串中删除字母并以相反的顺序返回它们,直到原始字符串为空。
非常感谢!