5

私もレビューした他のいくつかの投稿に表示される次の機能にこだわっています。

function findSequence(goal) {
  function find(start, history) {
    if (start == goal)
      return history;
    else if (start > goal)
      return null;
   else
      return find(start + 5, "(" + history + " + 5)") ||
             find(start * 3, "(" + history + " * 3)");
 }
  return find(1, "1");
}

print(findSequence(24));

このリンクにも記載されています。

Javascript ..このチュートリアルでは完全に失われました

上記の説明では、答えは代わりに 11 の目標を設定しようとしました。最初に 11 に対してテストされる 1 の開始と、11 に対してテストされる 6 の開始があります。

この最初の 2 つの手順は理解しています。startしかし、2段目( :6とgoal:11の比較)から3段目( start:3と:11の比較)への跳躍が分かりませんgoal

start6 から 3 に戻り、11 に戻る (4 番目の箇条書き) のはどうですか?

4

1 に答える 1

7

OK、これはコンソール ログ ステートメントで強化されたバージョンのコードです。Chrome/Opera/Firefox 開発者ツールを開き、そこで次のコードを実行します。

function findSequence (goal) {
  function find (start, history, depth) {
    depth = depth || 0;
    console.log( Array( ++depth ).join('--> '), start, goal, history );
    if (start == goal) {
      console.warn( 'history' );
      return history;
    } else if (start > goal) {
      console.error( 'null' );
      return null;
    } else {
      console.info('recursion!');
      return find(start + 5, "(" + history + " + 5)", depth) ||
             find(start * 3, "(" + history + " * 3)", depth);
    }
  }
  return find(1, "1");
}

console.info( findSequence(24) );

このプログラムの呼び出しトレースを取得し、トレースを見て再帰の概念を視覚的に把握できることを願っています。

于 2012-10-27T03:39:00.043 に答える