• ベストアンサー

prologでNの階乗の逆関数を考える。

prologで、N!の逆関数をだすプログラムを 作りたいんですが、どうしたらいいですか? 逆関数でなければ作れるんですけど、逆関数となると 良い方法が思いつきません。 分かる方がいらっしゃいましたら、教えてくださいm(_ _)m

質問者が選んだベストアンサー

  • ベストアンサー
  • mide
  • ベストアンサー率44% (333/745)
回答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の両方が(バックトラックで)帰るようにした方がいいでしょうね。

kakera
質問者

お礼

ありがとうございましたm(_ _)m 2の方の方針で頑張ってみようと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Prologに関する質問

    いま, Prologで再帰プログラムなどを組んでるんですが先生に「Prologはアルゴリズムの勉強になるから他の言語になっても無駄が省けますよ」と言われました。私は, 非手続きか手続き言語かの違いしかわからないのですが実際のところこれは事実なのでしょうか?

  • prolog

    prolog言語のプログラミングができるフリーソフトを探しています。環境はwindows XPです。 知っている方がいらっしゃれば教えていただきたいです。よろしくお願いします。

  • prologの記号について

    prologを勉強中です.次のように階乗を計算します fact(N, 1) :- N < 1!. fact(N, X) :- N1 is N - 1, fact(N1, Y), X is N * Y. そのとき,1行目の最後の"!"は何を表すのでしょうか? たぶん,それ以上先を実行しないという意味だと思うのですが, 正しい意味が分かりません.ご指導お願いします.

  • Nの階乗

    この問題がどうすればいいのかまったくわかりません。 考え方を教えて下さい。 ------------------------------------------------ まず、プログラムの中で一つの整数N(1<=N<=100)を入力させる。そして、一桁ずつを一つの整数配列の別々の箱に入れる表現を用いて、Nの階乗を計算し、その結果を表示するプログラムを作れ。例えば1258をdat[4]=1, dat[3]=2, dat[2]=5, dat[1]=8と表す。アルゴリズムには、ループ(for文、while文、repeat文のいずれか)を用いなさい。

  • 逆関数について

     逆関数が何回読み返してもよく分かりません。  そもそも何のためにわざわざ逆関数を求める必要が  あるのでしょうか?  たとえば  Y=tanX の逆関数の微分を求めよという問題の  場合。何度しても途中でどっちがもとの関数だったか  こんがらがってしまいます。  何かいい方法をご存知の方おられないでしょうか?  またひょっとすると逆関数とは  Y=3X+5  のように単純に XとYが置き換わる  ものではなくて、簡単に置き換わらず、微分した  導関数の時点で、始めて便利なことがある  というようなものではないかとも思います。  よろしくお願いします。

  • Matlabでのinverse(逆関数)のあらわし方

    こんにちわ。 研究で急にMatlabを使わなければいけなくなりました、Matlab初心者です。 ちょっとお聞きしたいことがあり、質問させていただきます。 MatlabでのInverse(逆関数)の計算の仕方がわからず、途方にくれ ています。どなたか教えていただけないでしょうか? 三角関数の逆関数の計算を表したいんですが、たとえば、 f(n) = cos(π*n) 0<=n<=1 = 0 otherwise みたいな関数があったときに、この関数とこの関数の逆関数を計算し、グラフ化したいのですが。 よろしくお願いいたします。

  • prolog プログラム

    Xは日本人である:japanese(X)   Xは米国に住んだことがある:usa(X) Xは英語が話せる:english(X) 上の述語を使って、下のprologのプログラムを作成したいです。 分かる方いらっしゃいましたら宜しくお願いしたいです。 「太郎は日本人である」 「米国に住んだことのある日本人は英語が話せる」 「太郎は米国に住んだことがある」

  • prologでの数式の簡単化

    prologで微分をするプログラムを作ったのですが計算した結果が、例えば、 0*x^2+a*(2*x^1*1)+(0*x+b*1)+0 のように無駄に長くなってしまいます。そこでこれを簡単化する述語simple(P)を作りたいのですがどのようにしたら良いでしょうか? ?- simple(0*x^2+a*(2*x^1*1)+(0*x+b*1)+0). 2*a*x+b yes できれば上のような動作がするぐらいのものが作りたいです。 少なくとも余計な0,1を除去するくらいはしたいのですが・・・ お願いします。

  • 二重階乗n!! の定義域を拡張すると

    階乗n! の定義域を実数または複素数( z = 0, -1, -2,... を除く)に拡張したものがガンマ関数ですが、 二重階乗n!! の定義域を拡張するとどうなるのでしょうか? 参考 http://ja.wikipedia.org/wiki/%E9%9A%8E%E4%B9%97 より 多重階乗 階乗に似たもので、二重階乗がある。これは、自然数 n に対し、n が奇数なら 1 から n までの奇数の総乗、n が偶数なら 2 から n までの偶数の総乗である。これを n!! と書く。あまり使用されないが、逆正弦関数 Arcsin x のテイラー展開などに用いられる。便宜上、0!! = 1 , (-1)!! = 1 とされる。

  • 関数(逆関数)

    関数(逆関数) 以下の問題が分かりません。 グラフ問題なので回答しづらいと思いますが...。 とりあえず逆関数は求めてみましたが、これも合っているか怪しいです。 問. 次の関数とその逆関数のグラフを描け   y=x^2+x-1

離婚裁判での財産分与割合
このQ&Aのポイント
  • 結婚20年、性格の不一致から離婚を考えています。
  • 財産分与や養育費で問題があり、調停や裁判に進むことになりそうです。
  • 養育費が合意に至らず、主人の性格からして私に不利になる可能性があります。離婚裁判経験者の意見やアドバイスを求めています。
回答を見る

専門家に質問してみよう