問題タブ [tailrecursion-modulo-cons]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
data-structures - F#PurelyFunctionalDataStructures WeightBiasedLeftistHeap ex 3.4
私は岡崎の純粋関数型データ構造に取り組んでおり、物事のF#実装を構築しようとしています。私はまた、本にリストされている演習を行っています(いくつかはかなり挑戦的です)。元の2パスの実装ではなく、シングルパスで実行されるようにWeightBiasedLeftistHeapのマージ関数を変更する必要がある演習3.4に固執しています。
私はまだこれを行う方法を理解することができず、いくつかの提案を望んでいました。SOに関する別の投稿があり、makeT関数をほぼインライン化することでSMLでそれを実行しています。私はこのルートを開始しました(コメントセクション3.4 First Tryで。しかし、これは実際にはシングルパスで実行されていないと思ったため、このアプローチを放棄しました(リーフに到達するまで、ツリーを巻き戻して再構築します)。それをまだ2パスマージであると解釈するのは間違っていますか?
これは、WeightBiasedLeftistHeapの完全な実装へのリンクです。
F#でこれを実行しようとして失敗したのは次のとおりです。
haskell - この Haskell コードは多くのメモリを消費しますか?
このコードのように:
Haskell では、多くのプログラムgroupsOf
が上記のコードのリストのような中間結果を構築し、保存しているように見えます。上記のコードは、Haskell の Web サイトから取得した Euler プロジェクトの問題 8 の参照回答です。元の質問では、 のような非常に長い数字の連鎖で連続する 5 桁の最大の積を求めます45343231635723421312443535767983456
。したがって、コードはすべての製品を計算し、リストとして保存します。他の言語では、一時的な最大値のみを保持し、それより小さい値は破棄すると思います。
それでgroupsOf
、本当にすべての中間結果を保存しますか? 問題が拡大した場合はどうなりますか?メモリを割り当てすぎますか?
java - 再帰アルゴリズムの実行時の複雑さ
私は高低を検索しましたが、実行時の複雑さ、再帰、および Java に関連する多くの資料を見つけることができないようです。
私は現在、アルゴリズムのクラスで実行時の複雑さと Big-O 表記法を学んでいますが、再帰アルゴリズムの分析に問題があります。
これは、二重にリンクされたリストを単純に繰り返し処理し、要素を出力する再帰的な方法です。
再帰メソッド呼び出しの数は DList 内のノードの数に依存するため、実行時の複雑さが O(n) であるということだけを思いつくことができますが、それでも快適ではありません。この答え。
d
との追加を考慮する必要があるかどうかはわかりませんd.getNext()
。
それとも、私は完全に軌道から外れており、実行時の複雑さは一定DNodes
ですDList
.
scala - 整数のペアの末尾再帰境界付きストリーム(Scala)?
私は Scala に非常に慣れていないので、私の無知を許してください! 最大値に制限された整数のペアを反復しようとしています。たとえば、最大値が 5 の場合、反復は次のように返されます。
これをストリームとして末尾再帰的に返すことにしました。
tailrec 注釈がないと、コードは機能します。
しかし、これは私には十分ではありません。コンパイラは、_pairs の最後の行が _pairs を返していないことを正しく指摘しています。
だから、私はいくつかの質問があります:
- 上記の実装に直接対処すると、どのように末尾再帰的に Stream[(Int, Int)] を返すのでしょうか?
- 一歩下がって、整数の制限されたシーケンスを反復処理する最もメモリ効率の良い方法は何ですか? Range は IndexedSeq を拡張するため、Range を反復処理したくありません。また、シーケンス全体をメモリ内に存在させたくありません。それとも私が間違っていますか?Range.view を繰り返し処理すると、それがメモリに入らないようにできますか?
Python (!) では、私が欲しいのは次のとおりです。
ご協力いただきありがとうございます!参考文献や API ドキュメントなどを読む必要があると思われる場合は、教えてください。私は学びたいと思っているからです。
prolog - 2つのリストを一緒に追加するためのPrologアルゴリズムの説明
これは、2つのリストを一緒に追加するアルゴリズムです。
結果はリスト[9,2,3,4,-10,-5,6,7,8]
であり、「」に保存されOt
ます。
私の質問は、これはどのように機能するのかということです。
私が理解しているのは、すべての再帰呼び出しで、最初のリストではテールのみがリストとして取得され(したがって、サイズが小さくなる1
までサイズが小さくなり[]
ます)、2番目の引数 " List2
"はまったく変更されず、3番目の引数は.. 。最初はです。[]
再帰呼び出しを行うたびにテールが取得されますが、なので[]
、そのまま[]
です。
では、どうして突然、3番目の引数( " Ot
")にリストが追加されたのでしょうか。誰かがこのアルゴリズムを段階的に説明できますか?
lisp - リストに要素を追加する末尾再帰関数
リストに要素を実装append
する例をいくつか見てきましたが、すべて末尾再帰を使用していません。そのような機能を機能的なスタイルで実装する方法は?
prolog - Prolog および一般的に末尾再帰を避ける必要がありますか?
私は楽しみのために「Learn Prolog now」オンラインブックに取り組んでいます。
アキュムレータを使用して、リストの各メンバーを通過し、リストに追加する述語を作成しようとしています。末尾再帰なしで簡単に実行できました。
しかし、パフォーマンス上の理由から、このタイプの再帰は避ける方がよいと読みました。これは本当ですか?常に末尾再帰を使用することは「良い習慣」と見なされますか? 良い習慣を身につけるためにアキュムレータを使用する価値はありますか?
この例をアキュムレータを使用するように変更しようとしましたが、リストが逆になります。どうすればこれを回避できますか?
recursion - 方式末尾再帰
ネストされたリストのリストを平坦化するスキーム末尾再帰関数 flatten-tl-rec を作成しようとしています。
しかし、私は(13 12 11 10 9 8 7 6 5 4 3 2 1)
代わりに取得してい(1 2 3 4 5 6 7 8 9 10 11 12 13)
ます。ここで何が問題なのですか?