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

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

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

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

Q&A

解決済

4回答

478閲覧

数列ではない再帰呼び出しの問題

ON_theashtray

総合スコア16

C

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

0グッド

0クリップ

投稿2022/07/05 07:40

編集2022/07/05 07:47

数列に関する問題を再帰はなんとなく理解できるようになったのですが、何回も入力させたり、パズルのような問題には全く太刀打ちできないのでここで質問させていただきます。
以下の問題を再帰呼び出しを利用して解いた場合のコードを教えていただきたいです。自分はわからなかったので配列を使用して解きました。

キーボードから 0 以下の整数が入力されるまで整数の列を入力して、入力した正の整数それぞれについてその数のプラス記号(+)を1行ずつ画面に表示するが、行の表示順が逆となるようなプログラムを作成せよ。
たとえば、4 5 3 10 2 -5 をキーボードから入力したときの出力は下記の通りである:
++
++++++++++
+++
+++++
++++

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

再帰で書きたいので、当然ながら再帰的に表します。

3 2 1 0という入力を例にすれば

text

1'3' が 入力される 2'2' が 入力される 3'1' が 入力される 4'0' が 入力される 5`1` に対応する出力をする 6`2` に対応する出力をする 7`3` に対応する出力をする

となるのはわかると思います。
これは

text

1'3' が 入力される 2 '2' が 入力される 3 '1' が 入力される 4 '0' が 入力される 5 `1` に対応する出力をする 6 `2` に対応する出力をする 7`3` に対応する出力をする

このような入れ子の繰り返し構造になっていて、どの入れ子のレベルを見ても

text

1c が 入力される 2 それ以降の入力を処理する 3c に対応する出力をする

となっています。

したがってこの操作をFとしたとき、
再帰的に表現(Fの説明にFがでてくるように)すると、

Fは、
キーボード入力cを取得する
cが0以下であれば終わり
0でなければFを行う
cに応じたを出力する

投稿2022/07/05 07:59

編集2022/07/06 01:38
ozwk

総合スコア13528

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

とりあえず、「行の表示が逆順」の所を無視して、
「キーボードから 0 以下の整数が入力されるまで整数の列を入力して、入力した正の整数それぞれについてその数のプラス記号(+)を1行ずつ画面に表示するようなプログラムを作成せよ。」
を再帰で書いてみましょう。

それをちょっと変えれば良いです。

投稿2022/07/05 07:56

otn

総合スコア84559

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C は main の再帰呼出しができるので、

C

1#include <stdio.h> 2 3int main(void) 4{ 5 int n; 6 scanf("%d", &n); 7 if (n > 0) { 8 main(); 9 printf("%d\n", n); 10 } 11}

これは解答ではなく、ヒントです。
数字を表示する代わりに、'+' を表示するように出来ますか?

投稿2022/07/05 17:04

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

擬似コードとしてはこんな感じ。
単純な繰り返し処理は末尾再帰で作るとよいですね。

void 再帰用関数( 前回までの入力から組み立てた表示内容 ) { 入力内容を受付 if (入力内容が負数) { 「前回までの入力から組み立てた表示内容」を表示 return } 今回の入力内容と「前回までの入力から組み立てた表示内容」から、今回までの入力から組み立てた表示内容を作る 再帰用関数( 今回までの入力から組み立てた表示内容 ) // 再帰呼び出し }

投稿2022/07/05 14:58

ku__ra__ge

総合スコア4524

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2022/07/06 14:36

「逆順に表示」なので、表示処理と再帰呼び出し処理の順序が逆ですね。
otn

2022/07/06 14:41 編集

と思ったら、ちゃんと見ると、呼び出し毎に表示せず、追記保存して、最後にまとめて表示するつもりですか??
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問