ホームページ  >  記事  >  バックエンド開発  >  再帰二分探索について教えてください。

再帰二分探索について教えてください。

WBOY
WBOYオリジナル
2016-06-23 13:41:08815ブラウズ

$Arr=array(1,2,3,4,5,6);
Search($Arr,6,0,count($Arr)-1);
関数 Search($Arr, $FindVal,$LeftIndex,$RightIndex){
if($FindVal>$Arr[count($Arr)-1]){
echo "値が見つかりません"
}else if($FindVal<$Arr[ 0]){
echo "値が見つかりませんでした";
}else{
$MiddleIndex=round(($LeftIndex+$RightIndex)/2);
if ($Arr[$MiddleIndex]<$FindVal){
Search($Arr,$FindVal,++$MiddleIndex,$RightIndex);
}else if($Arr[$MiddleIndex]>$FindVal){
Search($Arr,$FindVal,$LeftIndex,--$MiddleIndex) ; 実装について詳しく説明したいと思います。特に、条件が満たされたと判断して関数を再度呼び出すたびに、少しめまいを感じます




ディスカッションに返信してください。解決策)

また、今後の実際の開発プロセスにおいても、この種の検索の知識は引き続き使用されますか?

この条件が満たされた場合 if ($Arr[$MiddleIndex]<$FindVal){
Search($Arr,$FindVal,++$MiddleIndex,$RightIndex);

ここで ++$MiddleIndex によって返される値は次のとおりです。 $LeftIndex を置き換えませんでしたか?

戻った後、関数 Search($Arr,$FindVal,$LeftIndex,$RightIndex) の値は $Arr $FindVal または 6 になりますか? $LeftIndex は前の $MiddleIndex (4 に等しい) と等しくなりますか?これは正しい理解ですか?


関数のエントリに
echo "FindVal:$FindVal LeftIndex:$LeftIndex RightIndex:$RightIndexn"; を追加しているのがわかりますか?

タイミング ダイアグラムの書き方を教えて、自分で分析してください

もう 1 つの問題は、Search($Arr,$FindVal,++$MiddleIndex,$RightIndex); を 2 回目に呼び出すときです。 、中の変数の位置は変更できますか?例えばこんな風に書くと? Search($Arr,$FindVal,$RightIndex,++$MiddleIndex);

発行するコードがなければ、関数の内部変数名と外部変数名の間に接続がないため、順序は任意に変更できます。

上のタイミング図を例に挙げます。たとえば、変数 $a を持つ 3 つの列がありますが、それらは異なるもの (メモリ空間) を参照します。

グローバル環境 $a の下にあります。 | 最初の関数環境の $a | 2 番目の関数環境の $a
名前は同じですが、実際には異なります

1 階に Zhang San があり、2 階に Zhang がいるようなものです3 階の張三。環境が異なるため、同じ人物ではなく 3 人の人物を指します。

しかし、コードの送信方法のロジックに基づくと、環境 1 の $RightIndex と環境 2 の $RightIndex はどちらも同じ値が必要なので、変更することはできません。



タイミング図を描いて自分で分析する方法を教えます



こんにちは、タイミング図を確認した後、検索したい配列が $arr=array(1,3,4,5, 7,8 ,9)、いくつかの関数の層が必要であることがわかりました。私の誤解ですか、それとも本当ですか?教えてください。ありがとう。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。