• 締切済み

pl/pgsqlで再帰呼び出しは可能でしょうか。

pl/pgsqlで再帰呼び出しは可能でしょうか。 PostgreSQLのバージョンは9.2.3です。 作成しているファンクションは正方形の中心座標を求めてInsertするものです。 指定した回数だけ、再帰的に正方形を4分割にどんどん細分化していき、 それぞれの正方形の中心座標をInsertします。 4分割にした正方形をそれぞれ以下のように番号を振って説明します。  左上・・・(1)  右上・・・(2)  左下・・・(3)  右下・・・(4) 元の正方形を求めた後、(1)→(2)→(3)→(4)の順に再帰的にファンクションを呼び出します。 パラメータを「3回」以上にした場合は、(1)についてもまた4分割していきます。 ここで、パラメータを「1回」とした場合は、元の正方形の中心座標は当然Insertできます。 パラメータを「2回」とした場合、(1)の正方形の中心座標も求まりますが、 (1)の正方形については再帰の最終処理のため、Insert後にRETURNすることで エラーとなっているのか、1つ目の正方形のレコードも(2)の正方形のレコードも Insertされていません。 さらにはその「RETURN句」が元のファンクションすら「終了」させているようで、 (2)、(3)、(4)の正方形の処理が行われません。 このように再帰呼び出しをしたいと思っても、再帰中の処理を終わらせ、 呼び出し元に戻らせるはずのRETURN句が、一番最初のファンクションの「終了」と 理解されてしまい、pl/pgsqlでは再帰呼び出しは実現できないのでしょうか。 ファンクションのイメージは以下の通りです。 CREATE OR REPLACE FUNCTION Insert_squre( IN kaisuu INT, --再帰的に呼び出す回数 IN count INT, --再帰回数をカウント IN X1 INT, --正方形の左上の頂点のX座標 IN Y1 INT, --正方形の左上の頂点のY座標 IN X2 INT, --正方形の右下の頂点のX座標 IN Y2 INT --正方形の右下の頂点のY座標 ) RETURNS void AS $$ DECLARE /* 変数定義 */ ・・・・・ BEGIN /* 中心座標を求める */ ・・・・・ /* 中心座標をInsert */ ・・・・・ /* kaisuu=countならばRETURN */ ・・・・・ /* (1)の正方形について再帰処理 */ select Insert_squre( IN kaisuu INT, --再帰的に呼び出す回数 IN count+1 INT, --再帰回数をカウント IN X1 INT, --正方形の左上の頂点のX座標 IN Y1 INT, --正方形の左上の頂点のY座標 IN X3 INT, --正方形の右下の頂点のX座標 IN Y3 INT --正方形の右下の頂点のY座標 ); /* (2)の正方形について再帰処理 */ ・・・・・ /* (3)の正方形について再帰処理 */ ・・・・・ /* (4)の正方形について再帰処理 */ ・・・・・ RETURN; END; $$ LANGUAGE PLpgSQL;

みんなの回答

  • yamada59
  • ベストアンサー率74% (29/39)
回答No.1

関数の呼び出し方に問題があります。関数の呼び出し時には IN / OUT パラメータやデータ型の指定は不要です。 /* (1)の正方形について再帰処理 */ SELECT insert_square(kaisuu, count + 1, x1, y1, x3, y3); などと書き換えるとどうなるでしょうか。(2) ~ (4) についても同様です。 また、エラーメッセージが出力されていれば、提供してもらったほうが回答しやすいです。 あと、PostgreSQL には幾何データ型や幾何関数があるので、それらを使ったほうが関数をシンプルにできると思います。例えば、中心の座標を求めるcenterといった関数もあります。

参考URL:
http://www.postgresql.jp/document/9.2/html/functions-geometry.html
luida
質問者

補足

ご回答ありがとうございます! >関数の呼び出し方に問題があります。 >関数の呼び出し時には IN / OUT パラメータやデータ型の指定は不要です。   すみません、私の記載ミスで、再帰呼び出しの箇所にIN/OUT及びデータ型は記載していません。 >また、エラーメッセージが出力されていれば、提供してもらったほうが回答しやすいです。   初歩的な質問で申し訳ないのですが、標準出力には何も出力されません。   エラーとなっていることは確かなのですが、メッセージはどうすれば確認できますでしょうか。 >あと、PostgreSQL には幾何データ型や幾何関数があるので   そうなんですね。教えて頂きありがとうございます!参考になります。

関連するQ&A

  • 再帰呼び出しについて

    C言語について質問があります。 平成13年春の基本情報処理技術者試験に出ていた問題なのですが, このプログラムの流れが分かりません。 void DrawCurve(int sx, int sy, int x1, int y1, int x2, int y2, int ex, int ey, int len){ int p1x, p1y, p2x, p2y, p3x, p3y; int p4x, p4y, p5x, p5y, p6x, p6y; /** 途中省略 **/ DrawCurve(sx, sy, p1x, p1y, p4x, p4y, p6x, p6y, len); /* ↑を(1)と名付けさせて頂きます */ DrawCurve(p6x, p6y, p5x, p5y, p3x, p3y, ex, ey, len); /* ↑を(2)と名付けさせて頂きます */ return ; } (1)の処理に入ったらDrawCurve関数の先頭に行くと思うのですが, そうすると(2)の処理とreturnは絶対行われない気がするのです。 それとも(1)の後(2)の処理に行くのでしょうか? 再帰を間違って解釈してるのだと思います。 ご存知の方どうか教えてください。よろしくお願いします。

  • 正方形の一次変換

    注:以下の説明で行列は2×2の正方行列で(左上,右上,左下,右下)の順 xy座標平面において、y≧0の部分にあり、頂点の一つが原点にある正方形の内で一次変換         (x`,y`)=(7,√3,√3,5)(x,y) ・・・・・(1) によって長方形になるものを求めよ。 という問題で、正方形の1頂点の座標を(a,b)とおいて他2頂点の座標を定め、移された点を(1)で求めた後、 ・辺同士が直交する ・対辺の長さが等しい など求めてみましたが、式が一つになってしまい、(a,b)が求まりません。 どなたか、解答のアプローチなどご存知の方、教えていただきたいです。

  • 関数の再帰処理

    1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657... という数列(フィボナ数列)を再帰処理でだしたいのですが・・・・・ include <stdio.h> int function( int ); int main( void ){ int n; do { printf( "0 以上の整数値を入力して下さい→ " ); scanf( "%d", &n ); }while ( n < 0 ); printf( "計算結果: %d\n", function( n ) ); getchar(); getchar(); return 0; } int function( int n ){ //フィボナの処理(function)の再帰呼び出しによる } function内に再帰処理を用いてprintf( "計算結果: %d\n", function( n ) );で画面出力したいのですが・・・・・・。

  • 添付図の水色の部分の面積は、以下の手順で出せると思うのですが、正しいで

    添付図の水色の部分の面積は、以下の手順で出せると思うのですが、正しいでしょうか? (実際の面積は出す必要はないです。) 添付図は、以下の図形の一部で成り立っているものとします。   正方形   正方形に内接する円   正方形の頂点のひとつを中心とし、円の半径と正方形の一辺の長さが等しい円 考えている手順は以下のとおりです。 1.Oを原点、頂点Cを座標(1,1)とするxy座標を考える。   円の方程式は(x^2)+(y^2)=0と   ((x+1)^2)+((y+1)^2)=0なので、   連立方程式として上記二式を解くと、点P,Qの座標が求まる。 2.点の座標が解っているのだから、角POQ、角PAQの大きさが出せる。 3.円の半径と中心角が解っているのだから、扇型POQ、扇型PAQの面積が出せる。 4.また、点の座標が解っているのだから、三角形OAQ、三角形OAPの面積が出せる。 5.扇型POQの面積+三角形OAQの面積+三角形OAPの面積-扇型PAQの面積で、添付図の水色の部分の面積が出せる。

  • 答えを出すことは可能ですか?(図)

    図がかけないので、文字で説明します。 紙と書くものを用意してください。 1.一辺が10cmの正方形の中に、中心が同じ5cmの正方形があります。 ※漢字の「回」のような感じです。 2.10cmの正方形の左上から、右下に対角線を一本引きます。 3.10cmの正方形の各頂点から各辺の中点の長さで コンパスを使い、90度の扇形を4つ描いて作ります。 4.星みたいな形が出来ると思います。 ここで、問題なんですが (1) 左上のちょっと、欠けた扇形 (2) (1)の扇形の欠けている部分 (3) コンパスでひいたときに出来る、(1)の隣の2辺が曲がった二等辺三角形のような形 (4)真ん中に2つ出来る、変な形 書いている自分でも意味が分からなくなるような奇問です。 答えがあるかどうか分からない問題ですので、無理に解かなくても大丈夫です。 もしも、出来たら教えてください!お願いします。 あと、使うかどうか分からないんですが、難しい記号や、関数は出来るだけなしでお願いします。 意味が分からないところは、出来るだけお教えします。 気が向いたときにでも、考えてください。 お願いします!!!

  • 最接近点を持つ線を特定

    お世話になります。 宜しくお願いします。 現在、swingとawtを駆使して、線や図形の描画を行うアプリを作成しています。 その中で、次の様な事をする場合の処理で躓いております。助けてください。 よろしければ添付の図をご参照下さい。 ほぼ中央にサイコロの「1」の目の様な正方形があり、 その中心に赤い円(中心点)があります。 図示上ではわかりやすいように赤い円で示しましたが、実際には1pixelの点です。 そして、4本のラインがまとわり付いていると思います。 これらのラインの内、「中心点との最接近点を持つ線」を特定したいです。 各座標同士の頂点情報は、図形の親要素(TextPane)の0,0からの相対頂点情報として、 いつでも参照可能なスコープの変数に保持していますので、 後は特定する為の計算式にあてはめるだけと考えておりますが、難航しております。 どうかお助け下さい。よろしくおねがいします。 <他> ・全ての頂点座標は必ず0,0以上の値となります。 ・中心点は必ず正方形の中心に描画されます。ただし、正方形自体の描画位置は無作為です。 ・ラインは図示上では4本ですが、実際にはn本です ・ラインは図示上では適度に分散していますが、頂点情報は再描画の度、完全に無作為に設定されます。 ・図形をTextPaneの中に書く所までは問題なくできています。

    • ベストアンサー
    • Java
  • 面積の問題

    1辺acmの正方形ABCDの各頂点を中心として半径acmの弧をかき、交点をe(上),f(右),g(下),h(左)とする。次に、e,f,g,hを通る正方形p(右上)q(右下)r(左下)s(左上)を、その辺が正方形ABCDの辺と平行になるようにする。このとき、影をつけた部分の面積(多角形sh~e,pf~e,rh~g,qf~g)を求めよ。

  • 互換ベーシックN88について

    互換ベーシックのプログラミングで、「正方形の容器の中に円形の分子が飛び回っている。分子一個が容器の中を飛び回ってい様子を作れ。」という課題が出たのですが、このプログラミングを何方か教えてください。分子の半径は3で、容器の左上の座標を(150、40)右下の座標を(480、360)とするとLINE(150、40)-(480,360),4,Bという命令で箱が作れるそうです。

  • 定積分 体積

    座標空間において、4点(2,2,0)、(-2,2,0)、(-2、-2,0)、(2、-2,0)を頂点とする正方形を底面とし、点(0,0,4)を頂点とする四角錐の内部で、x>=1にあたる部分の体積の求め方を教えてください。

  • 角度を変えて、縮小した場合の中心座標の求め方

     座標が左上基準になっています。  キャンバス座標 x:1000 y:1000 の位置に  四角形 400 × 200 を 配置すると  x:1000 y:1000のままですが、ここから 四角形を縮小して、角度を変えると   左上の座標の位置が変わってしまいます。  四角形の左上の座標を求める式と、  できればその四角形の中心座標を求める式を教えてください。