• ベストアンサー

再帰手続きを用いたプログラム

1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 ↑のような表を出力するプログラムを再帰を使ってJavaで記述したいのです。 上の表の規則は、ある数値P(i,j)の値はP(i-1,j-1)+P(i-1,j)になることは解ったのですが、それをどうコーディングすればいいのか、どなたか教えていただけませんか?よろしくお願いします。

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

public class Sample { //数値P(i,j)の値はP(i-1,j-1)+P(i-1,j) //i>=1,j>=1 public static int p(int i, int j){ if(j==0) return 0; if(j==i) return 1; return p(i-1,j-1)+p(i-1,j); } public static void main(String[]args){ for(int i=1;i<=6;i++){ for(int j=1;j<=i;j++){ System.out.print(p(i,j)+" "); } System.out.println(); } } }

takkichi
質問者

お礼

夜遅い時間にもかかわらず、早速のご回答有難うございます!プログラミング初心者ですので、今いろんなカベにぶつかっている最中です。これで胸のつかえが1つ解消されました。感謝いたします。

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

その他の回答 (1)

回答No.1

ヒント:i って何? j って何?

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

関連するQ&A

  • Java規則性のある再帰的手続きを用いた課題

    初心者です。これからJavaプログラムについて学ぼうと思っています。以下のような問題があるのですが、答えが示されていません。美しいプログラム例を教えていただけると幸いです。また、初心者にお勧めでこのこの問題にも対応できるような力がつくお勧めの書がありましたらご教示ください。 問題)以下のような規則性を利用して、この表を画面に表示するプログラムを再帰的手続きを用いてJavaで記述せよ。(表示は5段まで)。        1     1 1    1 2 1   1 3 3 1  1 4 6 4 1

    • ベストアンサー
    • Java
  • 再帰プログラム

    strに格納されている文字数を数えるプログラムです。 #include<stdio.h> int rstrlen(char *); int main(void) { char str[] = {"abcdefghijk"}; printf("文字数:%d\n",rstrlen(str)); return 0; } int rstrlen(char *p) { if(*p) { p++; printf(p); return 1 + rstrlen (p); } else return 0; } return 1 + rstrlen (p);の部分で再帰をし1をプラスすることにより文字数をカウントしmainのprintfで文字数を表示しているのですがカウントしている値はどこに格納していてどのようにmainに返しているのかが分かりませんでした。教えてください。

  • ポインタ配列のプログラムについて

    ポインタ変数の配列のプログラム #include<stdio.h> void main() { char *p[] = {"JANUARY","FEBRUARY","MARCH","APRIL","MAY","JUNE", "JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER"}; int i,j; *p[0]=*p[2]; *p[0]=*p[2]; for(i = 0;i < 12; ++i){ printf("%2d 月:%s\n",i+1,p[i]); } for(i = 0;i < 12; ++i){ j = -1; do{ ++j; printf("%4x ",p[i]+j); } while (*(p[i]+j) != '\0'); printf("\n"); j = -1; do{ ++j; printf(" %c ",*(p[i]+j)); }while (*(p[i]+j) != '\0'); printf("\n"); } } について、このプログラムを最も大きい値(ASCIIの文字コードが最も大きい値)を出力するプログラムに変更したいのですが、ASCIIの文字コードが何なのかよく分かりません。分かる方いましたら教えてください。よろしくお願いします。

  • 再帰プログラムで合ってるのか間違ってるのか

    関数zeromade()を作ってプログラムを完成させよ。 プログラムは与えられた値から、0までを順に出力するものである。 例えば、5を入力したら、 5 4 3 2 1 0 と出力されるものである。 ただし、リカーシブ(再帰)プログラムで作成すること。 (つまりfor文やwhile文は出てこない。) main内部を変更してはならない。 という問題があり #include <stdio.h> #include <stdlib.h> int zeromade(int); int main() { int n; scanf("%d", &n); if (n < 3) { fprintf(stderr, "3 ijou no atai wo nyuuryoku site kudasai\n"); exit(1); } zeromade(n); exit(0); } int zeromade(int x) { if(x < 0){ ; }else{ printf("%d\n",x); return (x * zeromade(x-1)); } } とやってこれが正解なのか不正解なのかわからないので質問させていただきます コンパイルすると 5を入力 5 4 3 2 1 0 と出ます 足りないことがあれば補足で説明します

  • 再帰呼び出しについて(基本)

    #include <stdio.h> void dan(int i); void kuku(void); void dan(int i) { int j; for (j = 1; j <= 9; j++) printf("%3d", i*j); putchar('\n'); } void kuku(void) { int i; for (i = 1; i <= 9; i++) dan(i); } int main(void) { kuku( ); return(0); } というプログラムがあるのですが、danとkukuを再帰呼び出しにしたいのですが、再帰の仕方がまったく分かりません。 知り合いに聞くと、両関数の引数を1つずつ増やすとよいと言われたのですが、手をつけられない状態です。 よろしくご教授お願いします。

  • シグマのプログラムについて

       n   1 e = Σ ―――      j=0  j !  e=Σ(j=0~n) 1 / j !  (←上と同じ式です) この式でnを1から10まで変化させたときの値を出力するプログラムはどのようになるのでしょうか? 教えてください。お願いします。

  • 再帰的(リカーシブ)プログラムの説明について。

    以下は、再帰的(リカーシブ)プログラムの説明を記載しました。 この説明文でおかしい箇所の添削をお願い出来ないでしょうか? 宜しくお願い致します。 以下からになります。 再帰的(リカーシブ)プログラムとは、プログラムの中から自分自身を呼び出して実行することを再帰的(リカーシブ)アルゴリズムといい、この形式で再帰呼び出しを行うプログラムのこと。 まずは、再帰的アルゴリズムについて、例を使って説明を行いたい。 主プログラムとサブルーチンaがある。 主プログラムは、文字通り、主(メイン)となるプログラム。 サブルーチンは、主プログラムが呼び出して利用する処理をひとまとめにしたもの。 文字通り、サブとなる処理を行う。 主プログラムには、CALL aという命令が記述されている。 これはサブルーチンaを読み出すという命令。 この再帰的プログラムは、処理が終わったら、読み出された場所に帰っていく。 このため、戻り場所を記憶しておかないと帰る事が出来ない。 この戻り場所を記憶するのが、LIFO方式による記憶領域になる。 LIFO方式の記憶領域だから、スタック領域になる。 スタック領域だから、後入れ先出しで戻り場所を記憶していく。 まずは、1回目の呼び出しとして、主プログラムがサブルーチンaを呼び出している。 1回目の戻り場所を記憶しておく。 次にサブルーチンaを見ると、CALL a、つまり自分自身を読み出している。 これが2回目の読み出し。 このように自分自身を呼び出すことを再帰呼び出しという。 同じプログラムの中で自分自身を読み出しているのだが、コンピューターは、あたかも別のサブルーチンがあるように処理が行われている。 この場合、それぞれの処理で、別の変数を用意しながら処理を行う。 このサブルーチンで処理が終わった場合にも、もとに戻る必要がある。 これは2回目の呼び出しになるため、2回目の戻り場所を記憶しておく。 更に、3回目として再びサブルーチンaを呼び出す。 3回目の戻り場所を記憶し、また別の変数を用意しながら処理を行う。 ここで最後のサブルーチンで処理が終わったとする。 処理が終わったら、呼び出された場所に戻る。 戻り場所の記憶を見てみると、上から戻る順番に記録されていることがわかる。 戻り場所はLIFO方式、後入先出しで記録されているから、最後に呼び出した3回目の戻り場所が1番上に記録され、次に2、最後に1が記録されている。 最初は戻り場所を記憶した記憶領域を参照して、3回目に呼び出された場所に戻る。 ここで3の戻り場所が消える。 そして引き続き処理が行われる。 次に、2回目に呼び出した処理が終わり、2回目に呼び出された場所に戻り、2の戻り場所が消える。 また引き続き処理が行われ、1回目に呼び出した処理が終わり、1回目に呼び出された場所(主プログラム)に戻り、1の戻り場所が消える。 そして処理が行われ、プログラム全体が終了する。 このように、プログラムの中で自分自身を呼び出し、戻り場所を記憶しながら実行するようなプログラムを再帰的(リカーシブ)プログラムという。

  • 素数判定プログラム

    JavaScriptで素数を出力するプログラムを書いてみました。 最大値を15万程度にすると、「IEの動作を遅くしています」というメッセージが出ます。 もう少し高速で効率が良く、最大値を多くするにはどのように改良すると良いでしょうか? 最終的に、指定した値から○個の素数を出力する と言うプログラムにしたいと思っています。 例)100から10個 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, function prime() { document.form.tbox2.value = ""; var i;var l;var count = 0; var NUM = 100000; p = new Array(NUM); for(i=0;i<NUM;i++)p[i]=1; p[0]=0; for(i=2;i<=NUM/2;i++){ for(l=2;l*i<=NUM;l++){ if(p[l*i-1] == 1) p[l*i-1] = 0; } } for(j=min;count<pie;j++){ if(p[j-1] == 1){ document.form.tbox.value += j; document.form.tbox.value += ", "; } } }

  • プログラムがわからないのですが

    とあるC言語の本を読んだのですが、 さっぱり分かりませんでした。 例えば、こんな感じです。 「つぎのプログラムを実行し終わったときの各変数の値を 求めよ。」との事です。 以下、このようになります。 void main() { int i,j,k,l; float p; double x; i=9.2+7.3; j=13/4*4.0; i/=j%5;-(1) p=(--i +j++)/5.0; x=j-p*2; k=i==10llj<=20;-(2) l=i(p/2<x-2);-(3) } 上記のプログラムですが、i=7,j=13,k=1(真), lは0(偽)、pは3.8、xは5.4となります。 j,p,xについてはわかるのですが、 i=7,k=1(真)lは0(偽)について、何故そうなるのか わかりません。 しかし、私なりに考えてみました。 まず、iについては、 j=13ということから、 i/=13%5; i=i/13%5; %というのは、余りのことです。 よって、13÷5=2は、余りは3 iは、整数型だから、 16.5でなく、小数点は、切り捨てて i=16 i=16/3 i=5になるのではないでしょうか。 k=i==10llj<=20;-(2) l=i(p/2<x-2);-(3) の部分ですが、恐らく k=1(真)、lはO(偽)がわからないから、 (2)、(3)がわからないと思います。 (2)は、本で調べた結果、 kとiは、10また、jは、20以下で、 (3)の条件が成り立つのでしょうか。 もし宜しければ、何故、このようなこの答えが 成立するか教えて頂けないでしょうか。 それでは、宜しくお願いいたします。

  • ソートプログラム

    前に質問したものです。慌てていたのですみません。 Cで書いた直接選択法です。 #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000 void main( void ) { int min,s,t,i,j,k,a[N]; srand((unsigned int)time(NULL)); for(i=0;i<N;i++) a[i]=rand()%1000+1; for(j=0;j<i-1;j++){ min=a[j]; s=j; for(k=j+1;k<i;k++){ if(a[k]<min){ min=a[k]; s=k; } } t=a[j];a[j]=a[s];a[s]=t; for(s=0;s<i;s++) printf("%d,\t",a[s]); } } このプログラムを実行すると、1回ずつ入れ替えされたものが出力されます。 100回、200回、・・・と入れ替えを行った値を出力するには、どうすればよいでしょうか? ループを入れてみたりしてみましたが、、?? プログラムを再帰の方法をつかって書いたほうが、、、?? よろしくお願いします。