ホームページ >バックエンド開発 >PHPチュートリアル >PHP 基本アルゴリズム_PHP チュートリアル
PHPの基本アルゴリズム
ここでは、PHP で書かれたいくつかの基本的なアルゴリズムを紹介します。PHP プログラマーにとって、アルゴリズムの重要性は重要ではないようです。
はい、これは実際には非常に重要です。「アルゴリズム + データ構造 = プログラム」という古典的な言葉です。本物の高度な PHP として
プログラマーの皆さんはCに精通しているべきだと思います。本物のプログラマーになりたいなら、Cとデータ構造をよく学んでください
構造とアルゴリズム。ここでは基本的なアルゴリズムをいくつか紹介しますが、学ぶべきことはまだたくさんあります...
1. まず、ひし形を楽しく描いてみましょう。C を学習するときに本で描いたことがあります。PHP を使用してひし形を描いてみましょう。
半分終わった。
アイデア: 1 回の行数は何行で、その中で 1 回だけスペースとアスタリスクを使用します。
コードスニペット
for($i=0;$i<=3;$i++){
for($j=0;$j<=3-$i;$j++){
エコー ' ';
}
for($k=0;$k<=2*$i;$k++){
エコー '*';
}
echo '
';
}
2. C の基本アルゴリズムであるバブル ソートは、一連の数値を小さいものから大きいものへと並べ替えます。
アイデア: この質問は最小から最大の順に並べられており、最初のラウンドでは最小のものがランク付けされ、第 2 ラウンドでは 2 番目に小さいものがランク付けされ、3 番目のラウンドでは 3 番目に小さいものがランク付けされます。
例えて言えば…
コードスニペット
$arr = 配列(3, 2, 1);
$n = count($arr);
// ループするたびに、後続のソートを実行します
for($j=0; $j<$n-1; $j++) {
// 後でソートされないものについては、ループして最大 (最小) のものを見つけ、ソート処理を実行します
for($i=$j; $i<$n-1; $i++) {
if($arr[$j] > $arr[$i+1]) {
$t = $arr[$j];
$arr[$j] = $arr[$i+1];
$arr[$i+1] = $t;
}
}
}
print_r($arr);
3. Yang Hui Triangle、PHP で書かれています。
アイデア: 各行の最初と最後の桁は 1、変化はありません、中央が最前列と左列です
合計
1 行の出力です。興味があれば、書いて遊んでみてください。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
コードスニペット
//各行の最初と最後の文字が1で6行書かれています
for($i=0; $i<6; $i++) {
$a[$i][0]=1;
$a[$i][$i]=1;
}
//最初と最後の値を抽出して配列に保存します
for($i=2; $i<6; $i++) {
for($j=1; $j<$i; $j++) {
$a[$i][$j] = $a[$i-1][$j-1]+$a[$i-1][$j];
}
}
// 印刷
for($i=0; $i<6; $i++){
for($j=0; $j<=$i; $j++) {
echo $a[$i][$j].' ';
}
echo '
';
}
4. 一連の数値で数値を挿入する必要がある場合は、元の順序で挿入し、元の並べ替え方法を維持します。
アイデア: 挿入する数値より大きい位置を見つけて置き換え、次の数値を 1 つ戻します。
コードスニペット
$in = 2;
$arr = 配列(1,1,1,3,5,7);
$n = count($arr);
//挿入する数値がすでに最大値の場合は、直接印刷します
if($arr[$n-1] < $in) {
$arr[$n+1] = $in;}
for($i=0; $i<$n; $i++) {
//挿入する場所を見つけます
if($arr[$i] >= $in){
$t1= $arr[$i];
$arr[$i] = $in;
//次のデータを 1 ビット前に移動します
for($j=$i+1; $j<$n+1; $j++) {
$t2 = $arr[$j];
$arr[$j] = $t1;
$t1 = $t2;
}
// 印刷
print_r($arr);
死ぬ;
}
}
5. 一連の数値を並べ替えます (クイック並べ替えアルゴリズム)。
アイデア: 1 回の並べ替えで 2 つの部分に分割し、次に 2 つの部分を再帰的に並べ替えて、最後にそれらをマージします。
コードスニペット
関数 q($array) {
if (count($array) <= 1) {return $array;}
// $key を境界として 2 つの部分配列に分割します
$key = $array[0];
$l = 配列();
$r = 配列();
//再帰的ソートを別途実行し、配列を合成します
for ($i=1; $i
else { $r[] = $array[$i] }
;
}
$l = q($l);
$r = q($r);
return array_merge($l, array($key), $r);
}
$arr = 配列(1,2,44,3,4,33);
print_r( q($arr) );
6. 配列内で必要な要素を見つけます (二分探索アルゴリズム)。
アイデア: 配列内の特定の値を境界として使用し、最後まで再帰的に検索します。
コードスニペット
関数 find($array, $low, $high, $k){
if ($low <= $high){
$mid = intval(($low+$high)/2);
if ($array[$mid] == $k){
$mid を返します;
}elseif ($k < $array[$mid]){
return find($array, $low, $mid-1, $k);
}その他{
return find($array, $mid+1, $high, $k);
}
}
die(「持っていない...」);
}
//テスト
$array = 配列(2,4,3,5);
$n = count($array);
$r = find($array,0,$n,
7. array_merge() を使用せずに複数の配列をマージする 質問はフォーラムからのものです。
アイデア: 各配列を走査し、新しい配列を再形成します。
コードスニペット
関数 t(){
$c = func_num_args()-1;
$a = func_get_args();
//print_r($a);
for($i=0; $i<=$c; $i++){
if(is_array($a[$i])){
for($j=0; $j
}
} その他 {
die('配列ではありません!');
}
}
$r を返します;
}
//テスト
print_r(t(範囲(1,4),範囲(1,4),範囲(1,4)));
echo '
';
$a = array_merge(range(1,4),range(1,4),range(1,4));
print_r($a);
8. 牛年に牛を頼む: 4 歳の牛がいて、毎年 1 頭ずつ出産します。
まで、すべての子孫は同じ牛になります。
牛は15歳で不妊手術され、子供を産むことができなくなり、20歳で死んでしまいます。n年後には何頭の牛が生まれるでしょうか。 (フォーラムより) コードスニペット
関数 t($n) {
静的 $num = 1
for($j=1; $j
if($j>=4 && $j
if($j==20){$num--;}
}
$num を返します;
}
//テスト
エコー t(8);