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

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

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

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

再帰

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

9489閲覧

再帰呼び出しを用いた二分探索(binary search)について教えてください(C言語)

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

再帰

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/12/18 23:00

編集2019/12/18 23:47

#質問内容
二分探索の関数の作成についてです。for文を用いて二分探索の関数binaryを作成することはできたのですが、再帰呼び出しを用いてbinary関数を作成する方法の一部が分かりません。以下にプログラムと分からない箇所を示します。他の部分は合っていると思うのですが、もしお気づきの点があればご教授頂けると幸いです。

ループを用いた二分探索のプログラム

#include <stdio.h> /* プロトタイプ宣言 */ int binary(int n, int *data, int x); /* メイン関数 */ int main() { int data[8] = {1, 2, 3, 4, 5, 6, 7, 8}; printf("%d", binary(8, data, 7)); } /* binary関数の定義 */ int binary(int n, int *data, int x) /* nは配列の要素数 */ /* xは検索したい数字 */ { int left = 0; int right = n - 1; while(left <= right) { int middle = (left + right) / 2; if(x == data[middle]) { return middle + 1; }else if(x < data[middle]) { right = middle - 1; }else { left = middle + 1; } return 0; }

#再帰呼び出しを用いた二分探索のプログラム

#include <stdio.h> /* プロトタイプ宣言 */ int binary(int n, int *data, int x); /* メイン関数 */ int main() { int data[8] = {1, 2, 3, 4, 5, 6, 7, 8}; printf("%d", binary(8, data, 7)); } /* binary関数の定義 */ int binary(int n, int *data, int x) { int middle = (n - 1) / 2; if(x == data[middle]) { return middle + 1; }else if(x > data[middle]) { /* この部分が分かりません */ }else { return binary(middle, data, x); } return 0; }

#実行結果

7

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

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

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

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

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

Zuishin

2019/12/18 23:11

シグネチャを変えたほうがわかりやすくなると思います。 int binary(int start, int end, int *data, int x) でないとポインタ計算が入ってきます。
退会済みユーザー

退会済みユーザー

2019/12/18 23:19

コメントありがとうございます。 その方法での解答はできているのですが、関数の引数を3つにして作成せよとの条件があり困っているという状況です。情報不足で申し訳ありません。
Zuishin

2019/12/18 23:24 編集

それができてるなら後は機械的に足し算引き算するだけです。 まず引数 4 つのソースをもう一度書き、完全に動くことを確かめたら start が常に 0 になるように調整してみてください。そうすれば start は 0 に決まっているので渡す必要がなくなり、引数から外せます。
Zuishin

2019/12/18 23:26

start を 0 にするには、次の関数に渡す際に start には start - start を渡し、data には data + start を、end には end - start を渡せばいいでしょう。
退会済みユーザー

退会済みユーザー

2019/12/18 23:26

そのstartの調整に困っているので、プログラムなどでもう少し詳しく教えていただけますか?
退会済みユーザー

退会済みユーザー

2019/12/18 23:28

ありがとうございます。一度試してみます。
Zuishin

2019/12/18 23:28

今書きました。
退会済みユーザー

退会済みユーザー

2019/12/18 23:40

C# のタグがついてますが C/C++ の話では? であれば間違っていますのでつけ直してください。
退会済みユーザー

退会済みユーザー

2019/12/18 23:48

ご指摘の通り間違えておりました。先ほど修正いたしました。
退会済みユーザー

退会済みユーザー

2019/12/19 00:53

色々考えてみたのですが、x > data[middle]の場合がやはり分かりません。先ほどのコメントにあったstartをどこでどのように定義すればよいかが特に分からないです。
Zuishin

2019/12/19 01:06

ループの方、質問文を読む限りでは自分で書いたように見えるので、そのつもりで話しているんですが、違うんですか?
退会済みユーザー

退会済みユーザー

2019/12/19 01:13

ループのbinary関数、引数4つの場合のbinary関数は自分で作成しました。binary関数のはじめでstartを定義すると、再帰する際に毎回リセットされてしまうので困っています。
退会済みユーザー

退会済みユーザー

2019/12/19 01:39

自己解決いたしました。念のため報告させていただきます。
guest

回答1

0

ベストアンサー

イメージ説明
上記のように自己解決いたしました。

投稿2019/12/19 01:41

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/12/19 03:20 編集

すいません、勘違いがあったのでコメントを取り下げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問