コード同士のどの部分が影響を及ぼすのか理解できず困っています。
こちらの(http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_4_B&lang=jp)を問題に対して以下のように解答しました。
コードとしては一方の配列に含まれる値をもう一つの配列から二分探索を行うものなのですが、途中でforの無限ループが発生してしまいます。
以下コードになります。
c言語
1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5int binary(int a[],int left,int right,int x){ 6 int middle=(left+right)/2; 7 if(x==a[middle]) return 1; 8 9 while(left != right) { 10 if(x<a[middle])binary(a, left, middle,x); 11 12 if(x>a[middle])binary(a, middle+1,right,x); 13 } 14 return -1; 15} 16 17int main(){ 18int i, j,n,m; 19 20scanf("%d",&n); 21printf("%d",n); 22int s[n]; 23for(i=0;i<n;i++){ 24 scanf("%d",&s[i]); 25 printf("Ok"); 26} 27 28scanf("%d",&m); 29printf("%d",m); 30int t[m]; 31for(i=0;i<m;i++){ 32 scanf("%d",&t[i]); 33 printf("Ok"); 34} 35printf("読み込み終わり"); 36int x,ans,count; 37count=0; 38for (i = 0; i < m;i++) { 39 x=t[i]; 40 ans=binary(s,0,n,x); 41 if(ans==1)count++; 42 } 43printf("%d",count); 44 return 1; 45} 46
具体的にはコンパイル時に2つ目のfor scanf
for(i=0;i<m;i++){ scanf("%d",&t[i]); printf("Ok"); }
で無限ループをしました。
そこでコードを触ってみたところ、
「printf("読み込み終わり");」を以下を消した場合だと何故か
for(i=0;i<m;i++){ scanf("%d",&t[i]); printf("Ok"); }
の先程のループがとまり、「printf("読み込み終わり");」に到達したあとプログラムが終了します。
この理由がわかりません。
削除後のコードは以下になります。
#include <stdio.h> #include <stdlib.h> #include <string.h> int binary(int a[],int left,int right,int x){ int middle=(left+right)/2; if(x==a[middle]) return 1; while(left != right) { if(x<a[middle])binary(a, left, middle,x); if(x>a[middle])binary(a, middle+1,right,x); } return -1; } int main(){ int i, j,n,m; scanf("%d",&n); printf("%d",n); int s[n]; for(i=0;i<n;i++){ scanf("%d",&s[i]); printf("Ok"); } scanf("%d",&m); printf("%d",m); int t[m]; for(i=0;i<m;i++){ scanf("%d",&t[i]); printf("Ok"); } printf("読み込み終わり"); return 1; }
その後デバッグツールを使い、変数の確認等を行いましたが、
x>hit を満たしているのにもかかわらず再帰せずreturn -1に到達してしまいます。
x=4,hit=3である以上
if(x > hit){binary(a, middle+1,right,x);}
で再帰すると思うのですがなぜか再帰しません。(
画像のように13行目で再帰せずに14行目に抜けてしまいます。
これはなぜなのでしょうか?
今現在のコードは以下のようになります。
#include <stdio.h> #include <stdlib.h> #include <string.h> /* 二分探索 xは探したい値 */ int binary(int a[],int left,int right,int x){ int middle=(left+right)/2; if(x==a[middle]) return 1; if(left<right){ int hit=a[middle]; if(hit > x){binary(a, left, middle, x);} if(x > hit){binary(a, middle+1,right,x);} } return -1; } int main(){ int i,n,m; scanf("%d",&n); int s[n]; for(i=0;i<n;i++){ scanf("%d",&s[i]); /* 配列sの作成 */ } scanf("%d",&m); int t[m]; for(i=0;i<m;i++){ scanf("%d",&t[i]); /* 配列tの作成 */ } int x,ans,count; count=0;/* 見つかった回数カウント */ for (i = 0; i < m;i++) { x=t[i]; ans=binary(s,0,n-1,x); if(ans==1)count++; } printf("%d",count); return 1; }