将循环转换为递归函数

use*_*124 2 javascript string recursion function

我昨天写了一个函数来计算"a"字符串中的字符数.我的老师告诉我将代码重构为递归函数,我真的不知道怎么做.

我希望对这个主题有一些反馈,顺便说一句,我是JavaScript的绝对初学者.

function numberOfA(n){
var numberA =0;

for (i=0; i<=n.length; i++){

    if(n.charAt(i)== "a"  ){
        numberA++;}
    }
return numberA;

}
Run Code Online (Sandbox Code Playgroud)

按照一段代码调用函数:

var n = prompt("type a word");
var output = numberOfA(n);

alert (output);
Run Code Online (Sandbox Code Playgroud)

提前致谢 !

Nor*_*ard 6

递归的目标是创建一个自我调用的函数.
你可能有相互递归 - 函数A调用函数B,调用函数A ......但这里肯定不需要,并且当你知道你需要做两个不同的事情(每个函数一个)并且知道它时更适合你需要以蛙跳模式完成它们.

递归发挥作用的地方是你在考虑循环时.
通常情况下,当你使用循环进行操作时,最终可能会在彼此内部有两个或三个循环.
递归是一种思考循环的单次迭代中发生的事情,并且只编写执行该操作所需的代码的方式,而不是担心管理循环.

奇异递归的一个非常简单的例子可能是将数组的所有元素记录到控制台.
这不是一个实际的例子 - 这是一个简单的例子,它包含了制作实际例子所需的大部分内容.

var array = [ "one", "two", "three", "four" ];

function listNextItem (array, index) {
    var item = array[index];
    if (!item) { return; }

    console.log(item);
    listNextItem(array, index + 1);
}

listNextItem(array, 0);
Run Code Online (Sandbox Code Playgroud)

我创建了一个非常简单的函数,它看起来就像你最里面的循环内部.
它基于设置项变量array[index].
如果它不存在,我们就完成了,我们可以退出函数,所以我们不会尝试永远继续(这在递归时非常重要).

如果确实存在,我们记录项目的值.然后我们调用完全相同的函数,并将它传递给完全相同的数组,但我们传递它的值index + 1.

这会改变任何人的生活,还是让循环过时?
并不是的.

但这是获得递归的第一步.

下一步是return从递归中获取.

function recursiveAddOne (current, max) {
    if (current === max) { return current; }
    return 1 + recursiveAddOne(current + 1, max);
}

var total = recursiveAddOne(0, 3); // === 3 + 1 + 1 + 1
total; // 6
Run Code Online (Sandbox Code Playgroud)

通常在我的退货声明中,我会将答案发回给外界的变量.
我仍然这样做,但在这里我添加了一个call相同的功能,作为我回归的一部分.

那是做什么的?
好吧,在函数返回之前,外部函数不能返回值.
在ITS内部函数返回之前,内部函数不能返回值...

......它一直向下,直到我的终止条件得到满足.该条件返回其外部函数的值.该外部函数将该附加值返回给ITS外部函数......一直到最外层函数被放到一起放置所有其他函数的值,然后将THAT返回给外部世界.

这就像给每个俄罗斯套娃("babushka")娃娃做一件工作.
你从最大的一个开始,一直到最小的一个.
最小的一个人首先完成它的工作,然后将它交给下一个工作,它完成它的工作,然后再回到手中......一路回来直到你再次出现在外面.