【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?

A[N]を利用したヒープのプログラムを作りました。
A[i]の親は、A[(i-1)/2]であるヒープです。
(上に行くほど小さい整数を格納)
そしていまある整列されたヒープのなかからキーボードから入力した値xを検索する関数findを、
x ←検索する値
A[]←ヒープソートされた配列
n ←格納されているA[]の最後の添え字
として、

int find(int x, int *A, int i, int n)
{


if(A[i]==x){
printf("*\n"); /* ここの作業が行われているかを確認 */
return 1;
}

if(i>n)return 0;
if(A[i]>x){
return 0;
}
else if (A[i]<x){
i = 2*i + 1;
find(x, A, i, n);
i++;
find(x, A, i, n);
}
return 0;
}

というものを作ってみました。汚いかもしれませんが、とりあえず今はこれでいっぱいいっぱいです。
それで、当然のごとくうまくいきませんでした。
/**/内に書いたように、入力したxがヒープ内にある場合は「*」が一応表示されるのですが、どうもfindは1を返してくれません。0を返してしまいます。見つけた後もまだ再帰をくりかえしえしているようです。
どこがいけないのでしょうか。

A 回答 (1件)

findを再帰呼び出しする部分で、findの戻り値が1だったら return 1; としないと駄目なのでは?


(第一印象なので、テストしてません)

この回答への補足

↓の「なぜ」 は無いことに

補足日時:2003/09/18 23:51
    • good
    • 0
この回答へのお礼

すいません説明不足でしたm(_ _)m
全部調べて見つからなかった場合のみは0を返すようにしたいんです。
それで、見つかった場合は1を返してすぐにfind自体を抜け出したいってわけなんです。goto文は極力使いたくないので避けたいのですが・・
なぜ
関数自体を丸ごとかえてしまってもかまいません。何かいい方法はないでしょうか

お礼日時:2003/09/18 23:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!