3

「アルゴリズムは、実行されると特定のタスクを達成する操作の有限シーケンスであると定義されます」と、この定義があります。構文的にも意味的にも正しい C プログラムもアルゴリズムであると言えますか?

私の答えは TRUE ですが、私の教授は答えが FALSE であると言いました。私のブロックメイトもそうでした。彼らが使用した反例は

while(1) {

}

printf("%s","blahblah");

無限ループは意味的に正しくありませんが、printf() はタスクを実行するため、アルゴリズムです。printf() の代わりにループと putchar() を使用できるためです。

では、誰が正しいと思いますか?

4

1 に答える 1

5

あなたは教授に、正しい専門用語さえ知らないのなら、髪を分けるのをやめたほうがいいと言いました (ですから、この時点から、彼の質問は意味を成しませんが、ともかく...)。

「アルゴリズム」は、プログラムとは概念的に異なります。だから答えは

意味的に正しく、構文的に正しいCプログラムはアルゴリズムですか?

いいえ、プログラムはアルゴリズムと同じではないため、プログラムは... プログラムです。アルゴリズムは、言語にとらわれない問題の解決策を具体的に表現したものです(つまり、非常に一般的な方法で表現できます)。プログラムは、アルゴリズムの言語依存の具体的な実装です (C では、「as-if」ルールとコンパイラの最適化により、実際にはアルゴリズムと同じである必要はなく、エミュレートする必要があるだけです)。

もう1つのコメント:

無限ループは意味的に正しくありません

そうですね。もちろん、停止問題を単純に解決するわけではありませんが、無限ループが「意味的に正しくない」という意味ではありません。プログラムが予期しないことを行う場合、そのプログラムは意味的に正しくありません。を書くときにプログラムがハングする以外のことをすることを期待しない限りwhile (1) { }、問題はありません。

無限ループの概念がアルゴリズムと見なされるかどうかは別の問題です。一般に、決して終了しない命令シーケンスはアルゴリズムとは見なされません。おそらく、それはあなたの教授が話していたことです。ウィキペディアによると:

より正確には、アルゴリズムは、関数を計算するための明確に定義された命令の有限リストとして表現される効果的な方法です。

(私のものを強調)

于 2013-02-21T06:30:51.387 に答える