タグ付けされた質問 「loops」

2
Cのvoid型がempty / bottom型と類似していないのはなぜですか?
ウィキペディアと私が見つけた他のソースはvoid、空のタイプではなくユニットタイプとしてリストCのタイプを見つけました。void空の/下の型の定義によりよく適合するように思えるので、この混乱を見つけます。 void私が知る限り、値は存在しません。 戻り値の型がvoidの関数は、関数が何も返さないため、何らかの副作用しか実行できないことを指定します。 タイプのポインターvoid*は、他のすべてのポインタータイプのサブタイプです。また、void*C との間の変換は暗黙的です。 最後の点voidに、空の型であることの引数としてのメリットがあるかどうかはわかりvoid*ませんvoid。 一方、voidそれ自体は他のすべてのタイプのサブタイプではありません。これは、タイプがボトムタイプであるための要件であると言えます。
28 type-theory  c  logic  modal-logic  coq  equality  coinduction  artificial-intelligence  computer-architecture  compilers  asymptotics  formal-languages  asymptotics  landau-notation  asymptotics  turing-machines  optimization  decision-problem  rice-theorem  algorithms  arithmetic  floating-point  automata  finite-automata  data-structures  search-trees  balanced-search-trees  complexity-theory  asymptotics  amortized-analysis  complexity-theory  graphs  np-complete  reductions  np-hard  algorithms  string-metrics  computability  artificial-intelligence  halting-problem  turing-machines  computation-models  graph-theory  terminology  complexity-theory  decision-problem  polynomial-time  algorithms  algorithm-analysis  optimization  runtime-analysis  loops  turing-machines  computation-models  recurrence-relation  master-theorem  complexity-theory  asymptotics  parallel-computing  landau-notation  terminology  optimization  decision-problem  complexity-theory  polynomial-time  counting  coding-theory  permutations  encoding-scheme  error-correcting-codes  machine-learning  natural-language-processing  algorithms  graphs  social-networks  network-analysis  relational-algebra  constraint-satisfaction  polymorphisms  algorithms  graphs  trees 

1
チューリング完全性にはdo-whileループで十分ですか?
命令型プログラミング言語では、言語をチューリング完全にするための制御フロー構造としてwhile-doループで十分であることを知っています(制御フローに関する限り-もちろん、無制限のメモリと特定の演算子も必要です...) 。私の質問の要点は、do-whileループはwhile-doループと同じ計算能力を持っていますか?言い換えれば、命令を完全にスキップすることが不可能な場合、言語をチューリング完全にすることができます。 ここでのセマンティクスの一部は少し曖昧かもしれないことを理解しているので、具体的な例で実際の質問を言いましょう。 Brainfuck(BF)は、Turingターピットであり、唯一の制御フローはwhile-doループです[...](Brainfuckに慣れていない場合に備えて、質問の下部に完全な言語仕様があります)。さんはどこ、*新しい言語BFを定義してみましょう,.+-<>BFと同じ意味を持っていますが、代わりに[]私たちが持ってい{}たdo-whileループを示しています。つまり、BFとの唯一の違いは、すべてのループが少なくとも1回実行されてから、さらに反復がスキップされることです。 BF *チューリング完全ですか?もしそうなら、BFをBF *に変換する方法に興味があります。そうでない場合、どうすればそれを証明できますか? 私自身のいくつかの観察: すべてのBFプログラムをBF *に翻訳できるわけではありません。たとえば、BF *で値を読み取ったり印刷したりするプログラムを書くことは不可能です。プログラムが1つ以上の値を印刷する可能性がある場合、常に少なくとも1つを印刷します。ただし、BF *に変換できるBFのチューリング完全サブセットがある場合があります。 [f](最初の反復の効果をキャンセルしようとして)に(最初の反復の効果をキャンセルするために)単純に変換することはできません(a fのみで構成されるBrainfuckプログラム)。すべての計算可能な関数に計算可能な逆関数とb)がある場合でも、ループが必ずしも少ないとは限らないため、このステップを再帰的に適用しても、最初に終了することは保証されません。+-[]<>f-1{f}f-1f Brainfuck言語の簡単な概要を次に示します。Brainfuckは、各セルに最初はゼロのバイト値が含まれる無限テープで動作します。オーバーフローはラップアラウンドするため、255をインクリメントすると0になり、逆も同様です。言語は8つの命令で構成されています。 + Increment the current cell. - Decrement the current cell. > Move tape head to the right. < Move tape head to the left. , Input a character from STDIN into the current cell. . …

3
ループが再帰よりも速いのはなぜですか?
実際には、再帰はループとして書くことができ(逆も同様です)、実際のコンピューターで測定すると、同じ問題に対してループが再帰よりも速いことがわかります。しかし、この違いをもたらす理論はありますか、それとも主に経験的ですか?

2
whileループの理論と実装をつなぐ方法は?
私は教育目的で自分の小さなプログラミング言語に取り組んでおり、少し問題に遭遇しました。それにはいくつかの異なる解決策がありますが、それらはすべて洗練されていないように見えます-私が理解している限りでは不要です。しかし、私が持っている本やグーグル検索を読んでも、エレガントな解決策を見つけることができません。 だから問題は、私が理解しているように、基本的なラムダ計算を構築していることです。true / falseを抽象用語として定義しました。これらを関数と組み合わせて、if / then / elseの動作を実行できます。問題はループで発生します。再帰によって基本的なwhileループを定義できますが、実際にはスタックオーバーフローが発生します。私が理解しているように、通常の解決策はテールコールの最適化を実行することですが、どうすればよいかわかりません。条件文は言語で定義されています。そのため、コンパイラーは、whileループの本体が末尾にあることを認識しません。 ドラゴンブックは、ラベルとゴトがあると仮定してループを実装することに焦点を当てています。私は確かにそれをすることができました。ループ構造を組み込まない他の言語は、少なくとも条件文を組み込んでからTCOを行うように見えます。そして、私も確かにそれを行うことができました。しかし、私の理解では、抽象化を適用して削減を実行できる限り、ループ(およびその他すべて)はこれらの基本ブロックから構築できるはずです。 それで私は何が欠けていますか?それとも、「XとYがあれば何でもモデル化できる」が「実際のコンピュータでXとYがあれば何でもモデル化できる」とは異なり、実用的に組み込みが必要なケースの1つですか?目的?

2
時々減少しないwhileループのループバリアント?
私が持っているテストの練習問題に取り組んでおり、ループバリアントのすべての例は、ループの反復ごとに減少しました。これについては、a <bの場合、値は同じままです。私の試みはまた、時々aがbより大きくなり、その逆になるため、負の可能性があるループバリアントを取得しました。この質問のループバリアントを見つけて証明するためのアドバイスはありますか? def mystery(a,b): # Precondition: a >= 0 and b >= 0 while a >= 0 and b >= 0: if a < b: a, b = b, a else: a = a - 1 return a 編集:この質問に興味がある人にとって、私の最善の解決策は次のとおりです。 f1=a+2b+1f1=a+2b+1f_{1} = a + 2b + 1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.