この大きな階乗関数を高階関数に変換するにはどうすればよいですか?

素晴らしき世界

次のコードはcachefactorial関数の外部でオブジェクトを使用していますfactorial関数自体は階乗とキャッシュを見つけるあまりにも多くの関心を持っている大規模です。

このコードを高階関数に変換し、呼び出したときに同じ結果を生成するにはどうすればよいですか

console.log(factorial(5));
console.log(factorial(7));

cache = { }

function factorial(n) {
  
  if (n === 0) {
    return 1;
  }
  
  if (cache[n])
  {
    return cache[n];
  }
  
  console.log("Stack Up: " + n);
  
  var value = n * factorial(n - 1);
  
  console.log("Stack Down: " + value);
  
  cache[n] = value;
  
  return value;
}

console.log(factorial(5));
console.log(factorial(7));

ありがとうございました

再帰関数を記憶するための他の答えはすでにありますが、その答えをjavascriptの階乗に適応させて、より簡単に機能する方法を確認できるようにします

memoized 再帰関数を書く秘訣は、継続渡しスタイルです。非末尾再帰関数をスタックセーフにする場合にも、同様の手法が機能します。

console.logこの最初の例にいくつかのステートメントを残して、実際に計算を行っているときと、メモ検索を行っているときを確認できるようにします。

const memoise = f => {
  const memo = new Map()
  const compute = (x, k) =>
    (console.log('compute', x),
    memo.get(x, memo.set(x, f(x,k))))
  const lookup = x =>
    (console.log('lookup', x),
    memo.has(x) ? memo.get(x) : compute(x, lookup))
  return lookup
}

const factk = (x, k) => {
  if (x === 0)
    return 1
  else
    return x * k(x - 1)
}

const memfact = memoise(factk)

console.log(memfact(5)) // 120
console.log(memfact(7)) // 5040


ここでは、console.log内部の呼び出しを削除し、memoise代わりにメモ化されたフィボナッチ関数とメモ化されていないフィボナッチ関数を示しています。劇的な時間差の比較の間memoise(fibk)badfib

const memoise = f => {
  const memo = new Map()
  const compute = (x, k) =>
    memo.get(x, memo.set(x, f(x,k)))
  const lookup = x =>
    memo.has(x) ? memo.get(x) : compute(x, lookup)
  return lookup
}

const fibk = (x, k) => {
  if (x < 2)
    return x
  else
    return k(x - 1) + k(x - 2)
}

const badfib = x => {
  if (x < 2)
    return x
  else
    return badfib(x - 1) + badfib(x - 2)
}

console.time('memoised')
console.log(memoise (fibk) (35)) // 9227465 1.46ms
console.timeEnd('memoised')

console.time('unmemoised')
console.log(badfib(35))          // 9227465 135.85ms
console.timeEnd('unmemoised')

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

この階乗関数を完全に入力するにはどうすればよいですか?

分類Dev

この階乗関数を再帰的にするにはどうすればよいですか?

分類Dev

高階関数でこれを解決するにはどうすればよいですか?

分類Dev

jestで高階関数を比較するにはどうすればよいですか

分類Dev

Swiftで高階関数を作成するにはどうすればよいですか?

分類Dev

Jestで高階関数をモックするにはどうすればよいですか?

分類Dev

C#でF#高階関数を実装するにはどうすればよいですか?

分類Dev

Pythonを使用してこの関数/ forループをリスト内包表記または高階関数に変換するにはどうすればよいですか?

分類Dev

mapのような高階関数を書いたり、Javaで減らしたりするにはどうすればよいですか?

分類Dev

IndesignスクリプトでArray.reduce()のような高階関数を使用するにはどうすればよいですか?

分類Dev

引数を別の引数に挿入する高階関数を作成するにはどうすればよいですか?

分類Dev

静的関数を使用せずにこの高階関数をどのように書き直すのですか?

分類Dev

ReactでHTML要素を高階関数(HOC)に渡すにはどうすればよいですか?

分類Dev

データを生成する関数をとる高階関数をフローに入力するにはどうすればよいですか?

分類Dev

このbash完了関数をzsh完了関数に変換するにはどうすればよいですか?

分類Dev

この矢印関数を標準関数に変換するにはどうすればよいですか?

分類Dev

階乗関数のスタックオーバーフローを単体テストするにはどうすればよいですか?

分類Dev

高階関数を使用してClojureのすべてのサブツリーのリストを生成するにはどうすればよいですか?

分類Dev

この(予期しない)型が高階関数によって返されるのはなぜですか?

分類Dev

この例で高階関数をどのように記述しますか?

分類Dev

高階関数とIOアクションを数学的な観点から表示するにはどうすればよいですか?

分類Dev

大きな数の階乗を効率的な方法で見つけてもTLEを取得している場合は、どうすればよいですか?

分類Dev

高階関数の観点からリスト内包表記を表現するにはどうすればよいですか?

分類Dev

高階関数を使用して対角線の合計を取得するにはどうすればよいですか?

分類Dev

不必要なオーバーフローなしに大きな階乗の比率を計算するにはどうすればよいですか?

分類Dev

$は高階関数でどのように使用されますか?

分類Dev

高階関数コンポーネントのPropTypeを設定するにはどうすればよいですか?

分類Dev

Haskellでこの関数をExceptTからExceptに変換するにはどうすればよいですか?

分類Dev

関数をより複雑なmain()関数に変換するにはどうすればよいですか?

Related 関連記事

  1. 1

    この階乗関数を完全に入力するにはどうすればよいですか?

  2. 2

    この階乗関数を再帰的にするにはどうすればよいですか?

  3. 3

    高階関数でこれを解決するにはどうすればよいですか?

  4. 4

    jestで高階関数を比較するにはどうすればよいですか

  5. 5

    Swiftで高階関数を作成するにはどうすればよいですか?

  6. 6

    Jestで高階関数をモックするにはどうすればよいですか?

  7. 7

    C#でF#高階関数を実装するにはどうすればよいですか?

  8. 8

    Pythonを使用してこの関数/ forループをリスト内包表記または高階関数に変換するにはどうすればよいですか?

  9. 9

    mapのような高階関数を書いたり、Javaで減らしたりするにはどうすればよいですか?

  10. 10

    IndesignスクリプトでArray.reduce()のような高階関数を使用するにはどうすればよいですか?

  11. 11

    引数を別の引数に挿入する高階関数を作成するにはどうすればよいですか?

  12. 12

    静的関数を使用せずにこの高階関数をどのように書き直すのですか?

  13. 13

    ReactでHTML要素を高階関数(HOC)に渡すにはどうすればよいですか?

  14. 14

    データを生成する関数をとる高階関数をフローに入力するにはどうすればよいですか?

  15. 15

    このbash完了関数をzsh完了関数に変換するにはどうすればよいですか?

  16. 16

    この矢印関数を標準関数に変換するにはどうすればよいですか?

  17. 17

    階乗関数のスタックオーバーフローを単体テストするにはどうすればよいですか?

  18. 18

    高階関数を使用してClojureのすべてのサブツリーのリストを生成するにはどうすればよいですか?

  19. 19

    この(予期しない)型が高階関数によって返されるのはなぜですか?

  20. 20

    この例で高階関数をどのように記述しますか?

  21. 21

    高階関数とIOアクションを数学的な観点から表示するにはどうすればよいですか?

  22. 22

    大きな数の階乗を効率的な方法で見つけてもTLEを取得している場合は、どうすればよいですか?

  23. 23

    高階関数の観点からリスト内包表記を表現するにはどうすればよいですか?

  24. 24

    高階関数を使用して対角線の合計を取得するにはどうすればよいですか?

  25. 25

    不必要なオーバーフローなしに大きな階乗の比率を計算するにはどうすればよいですか?

  26. 26

    $は高階関数でどのように使用されますか?

  27. 27

    高階関数コンポーネントのPropTypeを設定するにはどうすればよいですか?

  28. 28

    Haskellでこの関数をExceptTからExceptに変換するにはどうすればよいですか?

  29. 29

    関数をより複雑なmain()関数に変換するにはどうすればよいですか?

ホットタグ

アーカイブ