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

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

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

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

Q&A

解決済

3回答

1133閲覧

[初心者] 再帰関数について

SmaSTATION

総合スコア29

C

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

0グッド

0クリップ

投稿2021/03/29 05:33

「0 と 1 だけからなる int 型配列と、その要素数を引数に受け取り、配列に含まれる 1 を数えて返す関数 count1() があるとき、その処理を行う再帰関数count1r() を作れ。その引数は、配列、処理対象となる先頭要素の添字、配
列の要素数である。」という条件のプログラムを作ります。
以下、コードになります。

#include <stdio.h> #define SIZE 8 int count1r(int a[], int index, int n){ if(index >= n){ return 0; }else{ return a[index] + count1r(a, index+1, n); } } int count1(int a[], int n){ return count1r(a, 0, n); } int main(void){ int bits[SIZE] = { 0, 1, 0, 0, 1, 0, 1, 1 }; printf("%d\n", count1(bits, SIZE)); return 0; }

質問事項
・最初の関数のif文はどういう処理を行っているのでしょうか。
私の解釈ですと、範囲外に行ったら「0」を返す。elseの部分は、あいまいです。
宜しくお願いいたします。

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

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

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

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

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

dodox86

2021/03/29 05:42

やりたいのであれば強力に止めはしませんが、まずは基本的な部分を自力で解けるようになってからの方が良いと思います。閉じていない質問の連投も敬遠されます。 [[初心者] 配列の処理に困ってます。] https://teratail.com/questions/330374 再帰は考え方で理解するのが最初は難しいか、解説されてもその気になっただけに終わる可能性があります。
SmaSTATION

2021/03/30 05:21

アドバイス、ありがとうございます。心得ておきます。
guest

回答3

0

これ↓でよくね?

C++

1#include <stdio.h> 2 3#define SIZE 8 4 5int count1r(const int* a, size_t size){ 6 // size==0 なら0、さもなくば a[0] + a[1]以降に含まれる1の数 7 return size == 0 ? 0 : a[0] + count1r(a+1,size-1); 8} 9 10int main(void){ 11 int bits[SIZE] = { 0, 1, 0, 0, 1, 0, 1, 1 }; 12 13 printf("%d\n", count1r(bits, SIZE)); 14 15 return 0; 16}

投稿2021/03/29 07:03

episteme

総合スコア16612

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

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

0

ベストアンサー

0,1 からなる長さnのint型配列aの添字index以降の1の数の合計」とは

  • index >= nの場合

当然0である。

  • そうでない場合

a[index]1である場合1個、そうでなければ0個」に「0,1 からなる長さnのint型配列aの添字index+1以降の1の数の合計」を足したものである。

なお「a[index]が1である場合1個、そうでなければ0個」というのはa[index]の値そのままである。

これをそのままコードにすると質問文のコードになってます。


が、質問文のコードは

その引数は、配列、処理対象となる先頭要素の添字、配列の要素数である。

という縛りのせいで無駄に複雑になっています。

単純に

0 と 1 だけからなる int 型配列と、その要素数を引数に受け取り、配列に含まれる 1 を数えて返す関数 count1()

を再起を使って実装するなら、

C

1int count1(int a[], int n){ 2 return n<=0 ? 0 : a[n-1] + count1(a,n-1); 3}

でいいです。

投稿2021/03/29 05:47

編集2021/03/29 07:24
ozwk

総合スコア13551

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

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

0

再帰関数なのにどうして名前が違うんですか?

投稿2021/03/29 08:38

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2021/03/30 18:57

なんか答えを教えちゃってるのがベストアンサーになってるけど、再帰関数は名前を同じにするんだよーー、あとは自分で考えてねーー、って考えさせるのがこの質問への最適な回答だったと思います。
Bearded-Ockham

2021/03/30 19:43

再帰関数なのは`count1r`で、元のコードでも、正しく動くかどうかは別にして、再帰してますが。
xail2222

2021/03/30 20:28 編集

参考情報をだして、あとは考えてね。という回答も良いと思いますが 「価値のあるコンテンツを世の中に残し届ける事を目的としています。」 のであれば、答えを書いた方がいいのでは。と思ったりします。 勉強するための参考書にも答えは載ってますし その答えを求める場合もあるのでは …ってか、確かに再帰関数になってますしね
退会済みユーザー

退会済みユーザー

2021/03/30 20:57

あー、そうですか。
xail2222

2021/03/30 21:01

私の疑問は解決しなさそうですね 残念です
退会済みユーザー

退会済みユーザー

2021/03/30 21:07

いやいや、価値ある情報を残したいという気持ちはわかりますし、私も価値ある情報を残すために、とっくに自己解決した情報を詳しくここに掲載することは多々あります。 ただ、今回の質疑応答は質問者がもっとしっかり考える時間を与えるべきだったなぁ、と思っています。
xail2222

2021/03/30 21:31 編集

返信ありがとうございます。 私的にはベストアンサーの日本語を理解しようとする事で十分勉強になると思いました。 その内容を自分で考える時間を与えた方がよかったかどうかは、私にはよくわからないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問