
No.1ベストアンサー
- 回答日時:
Prologですか、なつかしいっす。
<方針1>
Prologらしくバックトラック機構を生かして作るとすると…、
まず、0から順に数字を発生させる述語を作ります。逆階乗のプログラムでは、この述語を呼び、戻り値をすでに作ってある階乗の述語にかけ、その結果が与えられた数と等しければ発生させた数を答えとして返し、等しくなければバックトラックによって次の数を試します。
ただ、毎回階乗計算をし直すので、効率は悪いですね。
<方針2>
バックトラックせずに再帰で、積が与えられた数になるまで繰り返す、効率の良いバージョン。与えられた数が1なら、答え0でおしまい。そうでない場合、現在のNとN!を渡せるように引数を2つ増やした述語を、最初はN=1,N!=1で呼ぶことにします。この述語では、再帰のたびにNを1ずつ増やし、現在の積はN!として、それが与えられた数になるまで再帰を繰り返し、一致したらその時のNを答えとして返します。
どちらもN!が与えられた数を越えたらfailするようにしないと、対応するNがない時に止まらなくなります。また1に対しては0と1の両方が(バックトラックで)帰るようにした方がいいでしょうね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
画像生成AIのプロンプトの作り...
-
pythonでのローカルファイルか...
-
vba 正規表現について教えてく...
-
if関数とは?
-
プログラミングに興味があるの...
-
uwscでPauseキーが押されたら、...
-
Fortranでシステム時刻をカレン...
-
数行削除してコピーするbatファ...
-
秀丸エディターでの置き換え
-
vba クリップボードクリアにつ...
-
Geminiフォーム 画像生成で 人...
-
Python 3.12.2 か一番最新のパ...
-
AIがプログラムする時代のプロ...
-
pythonについて(初心者です)
-
pythonでhtmlファイルの指定文...
-
プログラム上での行のマージ方法
-
覚えることが少ないプログラミ...
-
従業員が1名だけのSierっている...
-
アルゴリズムとコードとは何で...
-
IT業で開発をされてる方々に質...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムの規模を表す単位「k...
-
ステップ数について
-
ライン数とステップ数の違いに...
-
ステップ数??
-
STEPについて
-
VB6.0で #の意味
-
メガデモ、4kbの受賞作品 ...
-
「ByRef引数の型が一致しません...
-
VBAで「% & $」を使う意味
-
ステップカウントツールが作成...
-
ドット絵のようなやつを作るに...
-
プログラムで 一番大きい を定...
-
COBOLの見積工数
-
三菱シーケンサ FX2Nについて
-
PythonのプログラムのDirに関す...
-
Octaveでのオイラー法とルンゲ...
-
シェルスクリプトについて
-
フラッシュメモリのリードライト
-
ステップ数によるスケジュール
-
パソコンでインターネット接続...
おすすめ情報