ホームページ >バックエンド開発 >PHPチュートリアル >再帰二分探索について教えてください。
$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,$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 の下にあります。 | 最初の関数環境の $a | 2 番目の関数環境の $a
名前は同じですが、実際には異なります
1 階に Zhang San があり、2 階に Zhang がいるようなものです3 階の張三。環境が異なるため、同じ人物ではなく 3 人の人物を指します。
しかし、コードの送信方法のロジックに基づくと、環境 1 の $RightIndex と環境 2 の $RightIndex はどちらも同じ値が必要なので、変更することはできません。
タイミング図を描いて自分で分析する方法を教えます
こんにちは、タイミング図を確認した後、検索したい配列が $arr=array(1,3,4,5, 7,8 ,9)、いくつかの関数の層が必要であることがわかりました。私の誤解ですか、それとも本当ですか?教えてください。ありがとう。