2

我昨天写了一个函数来计算"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);

提前致谢 !

4

5 回答 5

7

递归的目标是创建一个调用自身的函数。
你可能有相互递归——函数 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

通常在我的返回语句中,我会将答案发送回外部世界的变量。
我仍在这样做,但在这里我将 a 添加call到同一个函数中,作为我返回的一部分。

那有什么作用?
好吧,在内部函数返回之前,外部函数不能返回值。
在 ITS 内部函数返回之前,内部函数无法返回值...

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

这就像给每个俄罗斯套娃(“头巾”)娃娃一件作品。
你从最大的开始,一直到最小的。
最小的一个先做它的工作,然后把它交还给下一个,它做它的工作并把它交还给…………一直回来,直到你再次到外面。

于 2012-11-13T22:26:33.827 回答
1

好吧,递归的基本概念是用较小的版本解决问题。

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

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

a你的字符串中 s 的数量等于 1 加上第a一个之后的整个子字符串中 s 的数量是合乎逻辑的a

所以你要做的,是你添加到子字符串中的 s1的数量avascript


所以这里有一些伪代码

function numA(str)
{
    var substring = substr(index_of_first_a, str.length - index_of_first_a
    return 1 + numA(substring);
}
于 2012-11-13T21:56:03.513 回答
0

尝试这个:

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

以下是它的工作原理:

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

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

于 2012-11-13T22:02:54.167 回答
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);
于 2012-11-13T22:00:01.710 回答
-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 函数将调用当前正在执行的方法。

于 2016-08-07T08:09:21.113 回答