問題タブ [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.

0 投票する
2 に答える
767 参照

data-structures - F#PurelyFunctionalDataStructures WeightBiasedLeftistHeap ex 3.4

私は岡崎の純粋関数型データ構造に取り組んでおり、物事のF#実装を構築しようとしています。私はまた、本にリストされている演習を行っています(いくつかはかなり挑戦的です)。元の2パスの実装ではなく、シングルパスで実行されるようにWeightBiasedLeftistHeapのマージ関数を変更する必要がある演習3.4に固執しています。

私はまだこれを行う方法を理解することができず、いくつかの提案を望んでいました。SOに関する別の投稿があり、makeT関数をほぼインライン化することでSMLでそれを実行しています。私はこのルートを開始しました(コメントセクション3.4 First Tryで。しかし、これは実際にはシングルパスで実行されていないと思ったため、このアプローチを放棄しました(リーフに到達するまで、ツリーを巻き戻して再構築します)。それをまだ2パスマージであると解釈するのは間違っていますか?

これは、WeightBiasedLeftistHeapの完全な実装へのリンクです。

F#でこれを実行しようとして失敗したのは次のとおりです。

0 投票する
3 に答える
474 参照

haskell - この Haskell コードは多くのメモリを消費しますか?

このコードのように:

Haskell では、多くのプログラムgroupsOfが上記のコードのリストのような中間結果を構築し、保存しているように見えます。上記のコードは、Haskell の Web サイトから取得した Euler プロジェクトの問題 8 の参照回答です。元の質問では、 のような非常に長い数字の連鎖で連続する 5 桁の最大の積を求めます45343231635723421312443535767983456。したがって、コードはすべての製品を計算し、リストとして保存します。他の言語では、一時的な最大値のみを保持し、それより小さい値は破棄すると思います。

それでgroupsOf、本当にすべての中間結果を保存しますか? 問題が拡大した場合はどうなりますか?メモリを割り当てすぎますか?

0 投票する
5 に答える
4384 参照

java - 再帰アルゴリズムの実行時の複雑さ

私は高低を検索しましたが、実行時の複雑さ、再帰、および Java に関連する多くの資料を見つけることができないようです。

私は現在、アルゴリズムのクラスで実行時の複雑さと Big-O 表記法を学んでいますが、再帰アルゴリズムの分析に問題があります。

これは、二重にリンクされたリストを単純に繰り返し処理し、要素を出力する再帰的な方法です。

再帰メソッド呼び出しの数は DList 内のノードの数に依存するため、実行時の複雑さが O(n) であるということだけを思いつくことができますが、それでも快適ではありません。この答え。

dとの追加を考慮する必要があるかどうかはわかりませんd.getNext()

それとも、私は完全に軌道から外れており、実行時の複雑さは一定DNodesですDList.

0 投票する
2 に答える
2340 参照

scala - 整数のペアの末尾再帰境界付きストリーム(Scala)?

私は Scala に非常に慣れていないので、私の無知を許してください! 最大値に制限された整数のペアを反復しようとしています。たとえば、最大値が 5 の場合、反復は次のように返されます。

これをストリームとして末尾再帰的に返すことにしました。

tailrec 注釈がないと、コードは機能します。

しかし、これは私には十分ではありません。コンパイラは、_pairs の最後の行が _pairs を返していないことを正しく指摘しています。

だから、私はいくつかの質問があります:

  • 上記の実装に直接対処すると、どのように末尾再帰的に Stream[(Int, Int)] を返すのでしょうか?
  • 一歩下がって、整数の制限されたシーケンスを反復処理する最もメモリ効率の良い方法は何ですか? Range は IndexedSeq を拡張するため、Range を反復処理したくありません。また、シーケンス全体をメモリ内に存在させたくありません。それとも私が間違っていますか?Range.view を繰り返し処理すると、それがメモリに入らないようにできますか?

Python (!) では、私が欲しいのは次のとおりです。

ご協力いただきありがとうございます!参考文献や API ドキュメントなどを読む必要があると思われる場合は、教えてください。私は学びたいと思っているからです。

0 投票する
2 に答える
4094 参照

prolog - 2つのリストを一緒に追加するためのPrologアルゴリズムの説明

これは、2つのリストを一緒に追加するアルゴリズムです。

結果はリスト[9,2,3,4,-10,-5,6,7,8]であり、「」に保存されOtます。

私の質問は、これはどのように機能するのかということです。

私が理解しているのは、すべての再帰呼び出しで、最初のリストではテールのみがリストとして取得され(したがって、サイズが小さくなる1までサイズが小さくなり[]ます)、2番目の引数 " List2"はまったく変更されず、3番目の引数は.. 。最初はです。[]再帰呼び出しを行うたびにテールが取得されますが、なので[]、そのまま[]です。

では、どうして突然、3番目の引数( " Ot")にリストが追加されたのでしょうか。誰かがこのアルゴリズムを段階的に説明できますか?

0 投票する
5 に答える
4845 参照

lisp - リストに要素を追加する末尾再帰関数

リストに要素を実装appendする例をいくつか見てきましたが、すべて末尾再帰を使用していません。そのような機能を機能的なスタイルで実装する方法は?

0 投票する
5 に答える
6816 参照

prolog - Prolog および一般的に末尾再帰を避ける必要がありますか?

私は楽しみのために「Learn Prolog now」オンラインブックに取り組んでいます。

アキュムレータを使用して、リストの各メンバーを通過し、リストに追加する述語を作成しようとしています。末尾再帰なしで簡単に実行できました。

しかし、パフォーマンス上の理由から、このタイプの再帰は避ける方がよいと読みました。これは本当ですか?常に末尾再帰を使用することは「良い習慣」と見なされますか? 良い習慣を身につけるためにアキュムレータを使用する価値はありますか?

この例をアキュムレータを使用するように変更しようとしましたが、リストが逆になります。どうすればこれを回避できますか?

0 投票する
2 に答える
1454 参照

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)ます。ここで何が問題なのですか?