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 を呼び出します... しかし、それはここでは確かに必要ありません。リープフロッグ パターンでそれらを実行する必要があること。

再帰が作用するのは、ループについて考えているときです。
通常、ループを使用すると、2 つまたは 3 つのループが互いに重なってしまうことがあります。
ループの管理について心配する代わりに、再帰は、ループの 1 回の繰り返しで何が起こるかを考え、それを行うために必要なコードのみを記述する方法です。

単数再帰の非常に単純な例は、配列のすべての要素をコンソールに記録することです。
これは実用的な例ではありません。実用的な例を作成するために必要なほとんどの部分を備えた簡単な例です。

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

これは誰かの人生を変えましたか、それともループを時代遅れにしましたか?
あまり。

しかし、これは再帰を得るための最初のステップです。

次のステップは、returnfrom 再帰を取得することです。

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

通常、return ステートメントでは、答えを外部の変数に送り返します。
私はまだそれをやっていますが、ここcallではリターンの一部として同じ関数に a を追加しています。

それは何をしますか?
内部関数が戻るまで、外部関数は値を返すことができません。
内部関数は、ITS 内部関数が戻るまで値を返すことができません...

...そして、私の終了条件が満たされるまでずっと下がります。その条件は、その外側の関数に値を返します。その外側の関数は、その追加された値を ITS の外側の関数に返します... ...最も外側の関数が、他のすべての関数をまとめた値を渡されるところまでずっと、それを外の世界に返します。

それは、ロシアのマトリョーシカ (「バブシュカ」) 人形に作品を与えるようなものです。
一番大きいものから始めて、一番小さいものまで入っていきます。
最も小さいものが最初に仕事をし、次の仕事にそれを返します.

于 2012-11-13T22:26:33.827 に答える
1

再帰の基本的な概念は、それ自体の小さなバージョンで問題を解決することです。

numberOfA文字列(またはおそらく部分文字列)の長さを与える関数があります。

したがって"javascript' 、最初の文字列がインデックス 2 にある文字列があるとします。

a文字列内の の数は、a部分文字列全体の最初の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, 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 に答える
0

これを試して:

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

仕組みは次のとおりです。

  • nが空の文字列の場合、返し0て再帰を終了します。これが再帰の基本ケースです。
  • そうでなければ、文字列の最初の位置にある文字が"a"1 の場合は 1 を追加し、そうでない場合は 0 を追加し、いずれにしても文字列から最初の文字を削除して再帰を進めます。これが再帰の再帰ステップです。

ご覧のとおり、すべての再帰ソリューションには、少なくとも基本ケースと再帰ステップが必要です。

于 2012-11-13T22:02:54.167 に答える
-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 に答える