• ベストアンサー

javaの再帰関数を用いるプログラミング

1セント,10セント,25セントのコインを好きな枚数使う事ができる. 1234セントを支払う時最低何枚で払うことが出来るか?再帰関数を用いて現実的な速度で動くプログラムをjavaを使って作ってください! どうぞ宜しくお願いします!

  • Java
  • 回答数2
  • ありがとう数0

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

  • ベストアンサー
noname#6248
noname#6248
回答No.1

この問題文の場合、金額が多い方から使う方が枚数が少ないので 以下の再帰関数で大丈夫です。 use(int,int)と言う関数が自分自身を呼ぶので再帰関数と呼ばれます。 以下をコピーしPain.javaという名前で保存してコンパイルしてみてください。 もしも、使用するコインが25、15、12、1の時、払う金額が24の時は 12+12が最低枚数ですが、 15+1+1+1+1+1+1+1+1+1を返してしまうのが難点ですけどね。 そういう場合も加味しての再帰関数は・・・少し待ってください。 public class Pain{ public static void main(String[] args){ int payMoney = 1234;// 支払う金額 int useMoney = 0;// 支払った枚数 useMoney=use(payMoney,useMoney);// 支払った枚数 System.out.println("支払った枚数:"+useMoney); } //last:残り支払い useCoinそれまで使った枚数、return 支払った枚数 public int use(int last,int useCoin){ int coin[]={25,10,1};// 使用するコイン(金額が多い順に記述) if(last == 0){ return useCoin;//0なのでそれまで使った枚数を返す } for(int i=0;i<coin.length;i++) if(last >= coin[i]){ //使用するコイン決定 last=last-coin[i]; useCoin=useCoin+1; return use(last,useCoin);//再起処理 } } return -1;//支払不可能なので-1を返す } }

その他の回答 (1)

  • akinori_s
  • ベストアンサー率60% (21/35)
回答No.2

#1 C_ranさんのソースを参考に少し修正してみました。 useCoin関数では割り算で一気にそのコインが何枚必要か取得しているけど これやっちゃうと再起の意味があまりなくなっちゃうのかな... ま、参考まで。 public class Pain{  private static int COINS[] = {   25,10,1  };  public static void main(String[] args){   int payMoney = 1234;  // 支払う金額   int useMoney = 0;   // 支払った枚数   useMoney=useCoin(payMoney,0);// 支払った枚数   System.out.println("支払った枚数:"+useMoney);  }    public static int useCoin(int money,int coinIndex){   if(money <= 0){    return -1;   }   if((coinIndex < 0) || (coinIndex >= COINS.length)){    return -1;   }   int useMoney = (int)(money / COINS[coinIndex]);   System.out.println(""+COINS[coinIndex]+"セント:"+useMoney+"枚");   int lastMoney = money - (useMoney * COINS[coinIndex]);   if(lastMoney > 0){    int lastCoins = useCoin(lastMoney,coinIndex+1);    if(lastCoins > 0){     lastMoney += lastCoins;    }   }   return lastMoney;  } }

関連するQ&A

  • JAVAのプログランミング

    JAVAのプログラミングについて教えてください。 1,10,25,32円の4種のコインを好きな枚数使ってよい場合、ある金額を最少枚数のコインを用いて支払いたい。高速に動くプログラムを再帰関数を用いずに作れ。1234567円を払うには何枚のコインが必要かを出力せよ。

    • ベストアンサー
    • Java
  • javaの再帰呼びについてお願いします。

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

  • Javaで再帰アルゴリズムを作ることは可能でしょか?

    こんにちは。 私は今Javaを定期的に勉強しているのですが、わからないことが発生してしまい困っています。プログラミングの出来る方教えてください。 内容は再帰についてです。ある条件が整わない限りずっと再帰させるというプログラムを作りたいんですが、わかりません。 ↑文が変かな? 条件がそろわない限り同じ仕事をやってもらう。 これの方がわかりやすいかな? グーグルで「Java 再帰」と調べてもまったく理解しやすいサイトはないので、ここに投稿させてもらいました。ぜひわかりやすく教えてください。もしくはサイトを教えてください。そうすれば自力でやります。

    • ベストアンサー
    • Java
  • 再帰関数のインライン展開

    再帰関数のインライン展開は出来るのでしょうか? もし、出来るようならアセンブラではどのように表現されているんですか? C以外の言語でも、再帰関数のインライン展開が出来るプログラム言語があれば教えてください。

  • 再帰的な関数の作り方

    C言語の勉強をしている初心者です。 まだまだ始めたばかりでよく分かっていない状態です。 再帰的な関数が便利そうな事が書かれているのをよく目にしますが、何が便利でどう作ればいいのか分かりません。 分かりやすく教えていただけませんか。

  • 再帰呼びだし

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

  • 再帰呼び出し

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

  • コインのプログラムが作れずに困ってます

    US硬貨 1$コイン 50セントコイン 25セントコイン 10セントコイン 1セントコインを何枚でも使って、1$を作るとき、一番初めに作れなくなる枚数を求めるプログラムを作りたいのですが、どういったコードを書けばいいのか迷ってます。 質問がわかりづらいと申し訳ないので、補足として 例えば、一枚だったら 1$コインを使って作れます 二枚だったら 50セントコインを2枚使って作れます。枚数を増やしていって、ちなみに答えは77でした。手書きで一応解いてはみたんですが、不規則なパターンがあって、コインを細かくしていく方法ではなかなか難しくてコードができあがりませんでした。 他の金額でも使えるような汎用的なプログラムを作りたいと思っているんですが、どなたか解る方がいたらよろしくお願いします。

    • ベストアンサー
    • Java
  • 再帰関数を使うとき、ソフトウェアスタックはハードウェアスタックと比べてどれくらい遅い?

    再帰を使って関数を書こうと思うのですが、再帰する回数が不明なので、スタックオーバーフローを避けるためソフトウェアスタックを使おうと思っている者です。 ソフトウェアスタックはどれくらい遅いのでしょうか? どう実装すれば速度が改善されるのでしょうか?

  • C++でforや再帰関数を使わずに、総当りする方法はありますか?

    C++等で、forを使わず、再帰関数を使わずに多量のループで総当りする方法はありますでしょうか? 自己末尾再帰関数というのがネットで出てきますが、C言語系では使えないみたいです。 再帰関数で変数を全てスタティックにしても、関数の多重呼び出しで容量を食ってプログラムが動かないほどの計算をこなす必要があるのですが、こういった多数の桁のやり方になれておらず、先が見えません… また、全部をforにするのも、桁が大きすぎて問題があります。 どなたかご教授くださいますと幸いです。