0

べき乗関数のプロローグ定義とは正確には何ですか。私はこのコードを書きましたが、累乗関数の正確なコードを知りたいといういくつかのエラーが発生しました。

pow(X,0,1).
pow(X,Y,Z):-Y1=Y-1,pow(X,Y1,Z1),Z1=Z*X.

このコードに何か問題がありますか?

4

2 に答える 2

2

コードには 2 つの問題があります。

  • プロローグで算術演算を行うには、= の代わりに is/2 を使用する必要があります
  • 乗算の変数を交換する必要がありました (Z は Z1*X です)。
  • 指数が正であることを保証するためにガードを配置する必要があります。そうしないと、プログラムが終了しない状況が発生する可能性があります

固定コードは次のとおりです。

  pow(_,0,1).
  pow(B,E,R) :- E > 0,!, E1 is E -1, pow(B,E1,R1), R is B * R1.

これは、アキュムレータを使用した 2 番目の末尾再帰バージョンです。

  powa(B,E,R) :- powa(B,E,1,R).
  powa(_,0,A,A).
  powa(B,E,A,R) :- E > 0, !, E1 is E - 1, A1 is B * A, powa(B,E1,A1,R).
于 2011-09-27T05:06:05.673 に答える
1

ここを見てください -プロローグのパワー関数。組み込みの pow 述語は、ほとんどの算術述語と同様に、効率上の理由から Prolog では実装されていません。

于 2010-04-17T15:50:30.067 に答える