質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

解決済

【C言語 再帰呼び出し】 表示方法と硬貨の支払いについて

ccodereader
kimrisa_

総合スコア7

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

3回答

0評価

1クリップ

691閲覧

投稿2022/05/22 01:17

C言語で再帰呼び出し使ってプログラムをつくりたいのですが、
難解でどうすればいいのか四苦八苦しています。
どなたかアドバイスを頂けないでしょうか?

問題

200円を1円、5円、10円、50円、100円の5種類の硬貨を使って、何通りの支払い方法があるかを求めるプログラムを再帰呼び出しを使って作る。関数change(int n, int k)を定義(n 円をk 円以下の硬貨で支払う支払い方の数を返す関数)し、main()関数では、支払う金額を1円から200円まで1円きざみで繰り返して「1円 = 1通り」、、「200円 = ???通り」のように、200行の出力を得られるようにする。

現状として1円から200円まで1円きざみで繰り返すことはできたのですが、
「1円 = 1通り」、、「200円 = ???通り」と表す時に、下記のようになってしまいます。
1円=1通りのように横並びに書くにはどうすればいいのでしょうか。

1円= 2円= 3円= 4円= . . . 196円= 197円= 198円= 199円= 200円= 0通り

また、何通りか表す時に0になってしまうのですが、
どう組み合わせを変更したら良いものか全く手が出ず困っています。

サンプルプログラムしかりアドバイスしかり、
ご助力願えないでしょうか。
どうかよろしくお願いします。

現状

c

#include <stdio.h> #include <stdlib.h> // カウンタ変数 int i, count; //支払い方法の数を数える関数(n:200円をk:100円以下の硬貨で) int change(int n, int k){ int count; for(int i = 1; i <= 200; i++){ count = i; printf("%d円=\n",count); } //change(n, 1) は,1円玉だけしか使えないので1通り if (count == 1) { return 1; } else if(count == 5) { //change(n, 5) は,change(n, 1) + change(n −5, 5) return change(n, 1) + change(n - 5, 5); } else if(count == 10) { //change(n, 10) は,change(n, 5)+change(n−10, 10) return change(n, 5)+change(n - 10, 10); } else if(count == 50) { //change(n, 50) は,change(n, 10)+change(n−50, 50) return change(n, 10)+change(n - 50, 50); } else if(count == 100) { //change(n, 100) は,change(n, 50)+change(n−100, 100) return change(n, 50)+change(n - 100, 100); } else{ return 0; } } int main(){ int way; way = change(200, 100); printf("%d通り\n", way); exit(0); }

試したこと

横に並べようと思い、以下のようにしてみたのですが、上手くいきませんでした。

c

#include <stdio.h> #include <stdlib.h> //支払い方法の数を数える関数(n:200円をk:100円以下の硬貨で) int change(int n, int k){ //change(n, 1) は,1円玉だけしか使えないので1通り if (k == 1) { return 1; } else if(k == 5) { //change(n, 5) は,change(n, 1) + change(n −5, 5) return change(n, 1) + change(n - 5, 5); } else if(k == 10) { //change(n, 10) は,change(n, 5)+change(n−10, 10) return change(n, 5)+change(n - 10, 10); } else if(k == 50) { //change(n, 50) は,change(n, 10)+change(n−50, 50) return change(n, 10)+change(n - 50, 50); } else if(k == 100) { //change(n, 100) は,change(n, 50)+change(n−100, 100) return change(n, 50)+change(n - 100, 100); } else{ return 0; } } int main(){ int i, count, way; way = change(200, 100); for(int i = 1; i <= 200; i++){ count = i; printf("%s円=\n","%d通り\n", count, way); } exit(0); }

上記のエラー

c

test6.c:29:37: warning: data argument not used by format string [-Wformat-extra-args] printf("%s円=\n","%d通り\n", count, way); ~~~~~~~~~ ^ 1 warning generated.

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

dodox86

2022/05/22 02:22

まず、問題への解答の前提として『「main()関数では、支払う金額を1円から200円まで1円きざみで繰り返して「1円 = 1通り」...』とあるのですから、main関数の形態は「試したこと」で示したようなものでないといけないと思います。「現状」のものは無条件で不可なはずです。 「上記のエラー」とありますが、コンパイルエラーなのではなく、警告(Warning)です。printf()関数の書式制御文字列に対して与えられた引数(count, way)が合っていないと報告しています。printf()関数の使い方を再度ちゃんと確認しましょう。
jimbe

2022/05/22 04:16 編集

複数の問題に同時に対処するのは、良いことではありません。 まずは別のプログラム (test6a.c とか ) として、 "x円, 0 通り" と x=1~200 分出すプログラムを作成して練習?したほうが良いかもしれません。
jimbe

2022/05/22 07:17

再帰が難しければ、再帰を用いない change 関数を作ってから再帰化するという手順もあると思います

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。