将循环转换为递归函数

时间:2012-11-13 21:52:55

标签: javascript string function recursion

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

我想就这个主题提供一些反馈,顺便说一句,我是JavaScript的绝对初学者。

function numberOfA(n){
var numberA =0;

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

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

}

按照一段代码调用函数:

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

alert (output);

提前致谢!

5 个答案:

答案 0 :(得分: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);

我创建了一个非常简单的函数,它看起来就像是最里面循环的内部 它根据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

通常在我的回复声明中,我会将答案发回给外界的变量 我仍然这样做,但在这里我将call添加到同一个函数中,作为我返回的一部分。

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

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

这就像给每个俄罗斯套娃(“babushka”)娃娃做一件作品 你从最大的一个开始,一直到最小的一个 最小的一个人首先完成它的工作,然后把它交给下一个工作,它完成它的工作,然后再回到手中......一直回到你再次出去之前。

答案 1 :(得分:1)

嗯,递归的基本概念是解决自身较小版本的问题。

你有一个函数numberOfA,它给你一个字符串的长度(或者可能是子字符串)。

所以假设你有第一个字符串在索引2的字符串"javascript'

合理地说,字符串中a的数量等于1加上第一个a之后整个子字符串中a的数量。

那么你做了什么,是将1添加到子串a中的vascript个数


所以这里有一些psudocode

function numA(str)
{
    var substring = substr(index_of_first_a, str.length - index_of_first_a
    return 1 + numA(substring);
}

答案 2 :(得分:0)

function numberOfA(n, count){
    if(!n.length) {  
        return count;
    }

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

    return numberOfA(n.substr(1), count);
}
var numberA = numberOfA('asdfafeaa', 0);

答案 3 :(得分:0)

试试这个:

function numberOfA(n) {
    return n == "" ? 0 : (n.charAt(0) == "a" ? 1 : 0) + numberOfA(n.substring(1))
}

以下是它的工作原理:

  • 如果n为空字符串,则返回0并完成递归。这是递归的基本情况
  • 否则,如果字符串中第一个位置的字符是"a"加一个,如果不加零,则通过从字符串中删除第一个字符来推进递归。这是递归的递归步骤

如您所见,每个递归解决方案必须至少具有基本案例和递归步骤。

答案 4 :(得分:-1)

<!DOCTYPE html><html lang="en"><body><script>
var foo = function foo() {
console.log(arguments.callee); // logs foo()
// callee could be used to invoke recursively the foo function (e.g. arguments.callee())
}();
</script></body></html>

arguments.callee函数将调用当前正在执行的方法。