1

数値を指定すると、プログラムはその数値を得るために *3 または +5 のみを使用して一連の演算を返す必要があるため、2 つのパスがあります。このプログラムは、自分自身を呼び出すときにどの関数呼び出しを行うべきかをどのように知るのでしょうか? そして、各パスを呼び出す回数をどのように知るのでしょうか。言い換えれば、OR使用する呼び出しとそれぞれの数を決定するために演算子がどのように使用されているかわかりませんfind()

function findSequence(goal) {
    // we start at 1, and history is a string that will keep track of the operations
    function find(start, history) {
        // case when start and goal is 1.
        if (start == goal)
            return history; // return string containg 1
        // case when we build start past what we needed
        else if (start > goal)
            return null;
        else
            // Dont understand this part!
            return find(start + 5, "(" + history + " + 5)") ||
                find(start * 3, "(" + history + " * 3)");
    }
    return find(1, "1");
}

document.write(findSequence(13));
4

2 に答える 2

3

||演算子は、左側のオペランドの真偽値をチェックします。興味深いことに、この式はor||に評価されません。真理値が true の場合、式はその左側のオペランドに評価されます。そうでない場合は、右側のオペランドに評価されます。例:truefalse

> 5 || 10
5
> 5 || 0
5
> 0 || 10
10
> 0 || undefined
undefined

したがってa || b、実際には と同等a ? a : bです。同様に、a && b実際には次と同等a ? b : aです。

> 0 && 10
0
> 0 && undefined
0
> 5 && 10
10
> 5 && undefined
undefined

非ブール値の真の値は、JavaScript 仕様で決定されます。

  • 未定義 -> 偽
  • Null -> False
  • 文字列 -> 空の文字列の場合は False、そうでない場合は True
  • オブジェクト > 真

編集: ああ、mattedgod が指摘するように、式が結果に評価されるとすぐに、式の残りの部分はまったく評価されません。例えば:

> function fail() { throw "I failed!"; }
> fail()
XXX "I failed!"
> 5 || fail()
5
> 0 && fail()
0

上記の場合は失敗しませんが、次の場合は失敗します。

> 0 || fail()
XXX "I failed!"
> 5 && fail()
XXX "I failed!"

したがって、find()likeへの呼び出しが 2 つfind(...) || find(...)ある場合、最初の呼び出しの結果が真の真の値を持つ場合、その結果が返され、2 番目の呼び出しはまったく実行されません。最初の呼び出しの結果が偽の真の値を持つ場合、2 番目の呼び出しが実行され、式はその結果が何であれ評価されます。

于 2013-03-25T16:37:46.317 に答える
2

これは、「ショートサーキット」と呼ばれる JavaScript (および他の多くの言語) のプロパティに依存しています。

考えてみると、何かを true と評価していて、それがA || Bである場合、A が true の場合、式全体が true になります。B をチェックする意味は&&ありません。A が false で、あなたがを評価するA && Bと、式全体が false になるため、B を気にする意味がありません。

あなたの例では、最初の呼び出しがfind成功した場合、2 番目の呼び出しは実行されません。ただし、最初の呼び出しが成功しない場合 (false または null または JS false に評価される何かが返されると推測しています)、2 番目の呼び出しが実行されます。

于 2013-03-25T16:39:48.033 に答える