Javascript 使用递归反转字符串时实际发生了什么
我对Javascript比较陌生。我从概念上理解递归并看到它的价值。然而,我发现自己对实际发生的事情有点困惑。我知道这不是反转字符串的最简单方法。但我用它作为一个简单的例子Javascript 使用递归反转字符串时实际发生了什么,javascript,string,recursion,reverse,Javascript,String,Recursion,Reverse,我对Javascript比较陌生。我从概念上理解递归并看到它的价值。然而,我发现自己对实际发生的事情有点困惑。我知道这不是反转字符串的最简单方法。但我用它作为一个简单的例子 function reverse(str){ if (str === ""){ return ""; } else { return reverse(str.substr(1)) + str.charAt(0); } } 那么,当代码告诉我们递归地将第一个字符放在字符串的最
function reverse(str){
if (str === ""){
return "";
} else {
return reverse(str.substr(1)) + str.charAt(0);
}
}
那么,当代码告诉我们递归地将第一个字符放在字符串的最末端时,像“hello”这样的字符串是如何变成“olleh”的呢?希望我的问题有意义。提前感谢递归函数有两种情况:基本情况和递归情况。这里,基本情况是
if(str===“”){return”“;}
,递归情况是returnreverse(str.substr(1))+str.charAt(0)
考虑起作用的基本情况:reverse(“”
产生”
。那很容易
现在让我们考虑第二个最简单的例子:<代码>反转(“C”)< /代码>。这导致
reverse(str.substr(1))+str.charAt(0)
变成reverse(“”+“c”
,我们很容易看到的就是“c”
接下来,反转(“bc”)
。在这种情况下,表达式reverse(str.substr(1))+str.charAt(0)
变为reverse(“c”)+“b”
。从上面我们知道,reverse(“c”)
就是“c”
。因此,我们看到反向(“c”)+“b”
是“cb”
最后,让我们开始理解
反向(“abc”)
。这里,递归情况是reverse(“bc”)+“a”
。我们怎样才能知道什么是reverse(“bc”)
?我们做到了!根据刚才给出的解释,我们知道reverse(“bc”)
是“cb”
,因此reverse(“bc”)+“a”
是“cba”
,递归函数有两种情况:基本情况和递归情况。这里,基本情况是if(str===“”){return”“;}
,递归情况是returnreverse(str.substr(1))+str.charAt(0)
考虑起作用的基本情况:reverse(“”
产生”
。那很容易
现在让我们考虑第二个最简单的例子:<代码>反转(“C”)< /代码>。这导致
reverse(str.substr(1))+str.charAt(0)
变成reverse(“”+“c”
,我们很容易看到的就是“c”
接下来,反转(“bc”)
。在这种情况下,表达式reverse(str.substr(1))+str.charAt(0)
变为reverse(“c”)+“b”
。从上面我们知道,reverse(“c”)
就是“c”
。因此,我们看到反向(“c”)+“b”
是“cb”
最后,让我们开始理解
反向(“abc”)
。这里,递归情况是reverse(“bc”)+“a”
。我们怎样才能知道什么是reverse(“bc”)
?我们做到了!根据刚才给出的解释,我们知道reverse(“bc”)
是“cb”
,因此reverse(“bc”)+“a”
是“cba”
此函数将给定字符串的第一个字符放在“return”语句的末尾。
然后,通过删除旧字符串的第一个字符递归调用该函数,并再次执行相同的操作。迭代将如下所示:
输入单词:“你好”
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'
希望这会有所帮助此函数将给定字符串的第一个字符放在“return”语句的末尾。 然后,通过删除旧字符串的第一个字符递归调用该函数,并再次执行相同的操作。迭代将如下所示: 输入单词:“你好”
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'
希望这有助于呼叫反向(“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)
呼叫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)
我明白了。所以它从字符串中取出字母,并以相反的顺序返回,直到原始字符串为空
非常感谢 我明白了。所以它从字符串中取出字母,并以相反的顺序返回,直到原始字符串为空 非常感谢
console.log(str.substr(1))代码>console.log(str.substr(1))代码>