• 締切済み

再帰呼び出しを用いるnPk,nCk 計算プログラム作成

javaで再帰呼び出しを用いるnPk,nCk計算プログラム作成したいです。 同じクラスでnPk,nCkを求める事です。 再帰呼び出しで nからkを求める事ができないです。ひとつだけなら できますがふたつを一緒に求める事ができません。 なんか方法がないでしょうか?お願いいたします。 結果は 引数nとk値で、 nPk、nCkの計算結果を出したいです。

  • Java
  • 回答数5
  • ありがとう数5

みんなの回答

  • prophetok
  • ベストアンサー率44% (13/29)
回答No.5

一例として public class ReternValue { public long npk; public long nck; } を作成 private static long com(int n,int k) を private static ReternValue com(int n,int k) に変更して、中身を書き直す。 これで、分からなければ、JAVAを基本から学び直す必要あり。 サンプルソースに不明な点がいくつか (n >= r && r >=0) { rとは?kの間違い //nPk計算 return (n*com(n-1,k-1););//再帰呼び出し kはどこで評価しているの? kがマイナスになってもコールし続けてもいいの? これだとnの階乗しか求まらないと思うけど。

AllForever
質問者

補足

細かく教えていただき、本当に有難う御座います。 すごく勉強になりました。 後入力ミスが多すぎでしだね。気をつけます。 おかけ様で問題解けると思います。 これからもなんかあったらお願いします。

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.4

>下のソースで 再帰呼び出しを使ってnpkは求めっています。 これは、補足には「//nPk計算」としか書いていないが、本来は nPk を計算するロジックが書かれている。ということですか? >そのメソッドの元にnCkも求めたいです。 やっぱり日本語がわかりません。 nPk の結果を「利用して」nCk を求めたい、ということですか? nPk の計算ロジックと「同様にして」nCk を求めたい、ということですか?

AllForever
質問者

補足

nPk の結果を「利用して」nCk を求めたい事です。

  • prophetok
  • ベストアンサー率44% (13/29)
回答No.3

>結果は 引数nとk値で、 nPk、nCkの計算結果を出したいです。 ここだけで、質問者の意図を推し量り、「返値は一つしか返せないのでなんとかならない。」と解釈してみる。 ・二つの整数値をメンバーに持つクラスを作成し返値とする。 or ・参照引数として返す。 以上

AllForever
質問者

お礼

説明不足で理解しにくい問題を解釈して答えていただき、有難うございます。 初心者なので 「・二つの整数値をメンバーに持つクラスを作成し返値とする。」 がうまく理解できません。サンプル例とかあたっらお願いしてよろしいでしょか

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.2

>再帰呼び出しで nからkを求める事ができないです。 言ってる意味がまったくわかりません。 引数は n と k なんだから、「n から k が求まる」わけもないと思うのですが。 とりあえず、途中でいいのでコードを補足に書いて、 そのコードのどこで「n から k を求めたい」のかをコメントして下さい。

AllForever
質問者

補足

すみません。説明がおかしいでした。 下のソースで 再帰呼び出しを使ってnpkは求めっています。 そのメソッドの元にnCkも求めたいです。 mainメソッド{ ........... int n = Integer.parseInt(numn); int k = Integer.parseInt(numr); if (n >= r && r >=0) { //npk計算結果出力 System.out.println(com(n,k)); }else{ System.out.println("inputerror"); } } private static long com(int n,int k){ if( n ==0){ return 1; }else { //nPk計算 return (n*com(n-1,k-1););//再帰呼び出し } }

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.1

1つが出来るなら、それを2つ作って、2つを呼び出す関数を 作る、ではダメなのですか? 機能実現が目的ではなくて、パズルか何かの問題でしょうか?

AllForever
質問者

お礼

そうなんですよ、課題です。 参考させて頂きます。

関連するQ&A

  • 再帰呼び出しの計算量

    再帰呼び出しを用いた関数の計算量を求める方法がわからないので質問させていただきます. xのn乗を再帰呼び出しを用いて求める関数に関して,計算量を求める問題なのですが,どのような方針で求めればよいのでしょうか? int exponent(int x, int n) {   if(n == 0){     return 1;   }else{     return x * exponent(x, n-1);   } } exponentがn回呼ばれるからO(n)というのは間違いでしょうか?

  • 再帰呼び出し

    C++のクラスで n!=n(n-1)(n-2)...1 n!を求めるprogramを作らなくてはならないのですが 再帰を使わずに、関数factorial(n)を使わないといけません。 ちんぷんかんぷんです。 for(counterとcounter--を使った)物しか思いうかびません。 関数factorial(n)を使うというのはnに戻るつまり再帰というふうには ならないのですか? 関数と再帰の意味を漠然としかわかっていないのですが。 よろしくお願いします。

  • ストアドファンクションの再帰呼び出しについて

    「ストアドファンクションの再帰呼び出し」はできないのでしょうか。 hoge関数をhoge関数の中で呼び出しています。 hoge関数では、条件に当てはまらないと第三引数を、 編集して再帰呼出しをしています。 再帰呼出しする条件を引数に設定して実行すると、以下の実行結果(ERROR)が表示されます。 <実行結果> mysql> select hoge('7','1234','1234567891012'); ERROR 1424 (HY000): Recursive stored functions and triggers are not allowed. よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 再帰を用いた場合の計算量

    nの階乗を再帰呼び出しを用いて計算する以下のプログラムの計算量はいくらになるのでしょうか? 調べてみてもどこにも記述されていなくて困っています. int factorial(int n) {   if(n > 0)     return (n * factorial(n - 1));   else     return (1); } また,できれば求め方も教えていただけると嬉しいです.

  • 再帰呼びだし

    再帰呼びだし 問題1 再帰呼び出しを用いてint型の配列({-9、8、-7、6、5、4、1、3、6、9、2、-14})の最小値を求めて出力するプログラムを作成せよ。関数名はmin_of_arrayとする。 問題2 同じく再帰呼び出しを用いてint型の配列({3、4、1、5、2})を小さい方から順番に求めて出力するプログラムを作成せよ。 再帰呼び出しが苦手で、じっくり解いていこうと思ったのですが、他の課題もあって、もう提出期限いっぱいいっぱいなので載せました。 どうかよろしくお願いします。

  • nCrの計算

    nCrの計算のプログラムを nCr=n!/(r!(n-r)!) を用いて再帰的関数を使って書いたのですが、もし nCr=n(n-1)(n-2)・・・(n-r+1)/r! であることを用いて、nからmまでの掛算を実現する2引数の関数を定義して、再帰的関数呼び出しを用いたnCrのプログラムを作成するとしたらどうなるでしょうか。 関数x!の定義は、関数の宣言をlong factorial(int x)として、 if (x==0) return(1); else return(x*factorial(x-1)); となることは分かるのですが、 2引数の関数m(m+1)・・・nはどう作れば良いのか全くわからないので、プログラムが書けない状態です。アドバイスお願いします。

  • javaの再帰呼びについてお願いします。

    javaで nPn ,nCn 組み合わせ計算プログラムを 再帰呼びを使って 作成しようとしてますがとうやって書けばいいかわかりません。 初心者なんでわかりやすいコメントで お願いいたします

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

    #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つずつ増やすとよいと言われたのですが、手をつけられない状態です。 よろしくご教授お願いします。

  • メソッドの再帰呼び出しについて

    再帰処理に関する質問をさせていただきます。私は今複数のarraylistの中に入っているオブジェクトを順列を用いてすべての並びを所得するプログラムを作っています。プログラムが長く汚いので(汗)、例で示させていただきます。 (例) ArrayList t1; ArrayList t2; t1の中身[obj1,obj2] t2の中身[obj3,obj4] 結果:以下のように4つオブジェクトを作成 [obj1,obj3],[obj1,obj4],[obj2,obj3],[obj2,obj4] それに伴い、メソッドを作り再帰呼び出しを行っているんですが、returnでメインに返りません。戻り値はvoidです。また、 return; System.out.println("check"); と書くと、checkが出力されてしまっています(しかも何個も)。IndexOutOfBoundsExceptionのエラーがでるのですが、先にreturnを処理するはずなのになぜだろうと悩んでいます。 return以外にメインに戻る方法はあるんでしょうか?またreturnでメインに戻らない理由を知っている方がいるなら、ぜひ教えていただきたいです。よろしくお願いします。

  • C言語で、再帰呼び出しを使用せずに、文字列"(12 + 3) * (

    C言語で、再帰呼び出しを使用せずに、文字列"(12 + 3) * ( 3 * (4 + 5 ))"を、優先順位が低い順に二分木に入れる関数を作成したいのですが・・・。 char str[15] = ""(12 + 3) * ( 3 * (4 + 5 ))";なら char n[100];に n[0] = '*' n[1] = '+' n[2] = '*' n[3] = 12 n[4] = 3 n[5] = 3 n[6] = '+' n[7] = \0 n[8] = \0 n[9] = \0 n[10] = \0 n[11] = \0 n[12] = \0 n[13] = 4 n[14] = 5 (n[15] 以降は\0が格納されています。) というように入れたいのですが関数からその関数を呼び出す再帰を使わずに作成する方法がわかりません。 再帰を使用しなければかなり処理が複雑になるような気がしますがどなたか詳しい方よろしくお願いします。 言語はC言語です。

専門家に質問してみよう