Menjana Pilihatur Tatasusunan dalam PHP
Diberikan tatasusunan rentetan, seperti ['peter', 'paul', 'mary'] , tugasnya adalah untuk mencari semua pilih atur yang mungkin bagi elemennya. Permutasi melibatkan penyusunan semula elemen dengan cara yang mengekalkan identiti mereka. Output yang dikehendaki ialah:
peter-paul-mary peter-mary-paul paul-peter-mary paul-mary-peter mary-peter-paul mary-paul-peter
Penyelesaian 1: Menggunakan Fungsi Rekursif
Fungsi rekursif boleh digunakan untuk menjana pilih atur dengan memilih dan menyahpilih setiap elemen daripada tatasusunan. Fungsi pc_permute di bawah meneroka semua kombinasi yang mungkin:
function pc_permute($items, $perms = array()) { if (empty($items)) { echo join(' ', $perms) . "<br />"; } else { for ($i = count($items) - 1; $i >= 0; --$i) { $newitems = $items; $newperms = $perms; list($foo) = array_splice($newitems, $i, 1); array_unshift($newperms, $foo); pc_permute($newitems, $newperms); } } }
Fungsi ini mengambil dua parameter: $items (tatasusunan input) dan $perms (parameter pilihan untuk menjejak pilih atur semasa). Ia berulang melalui elemen dalam $items, mengalih keluar satu, menambahkannya pada permulaan $perms, dan kemudian memanggil dirinya secara rekursif dengan argumen yang diubah suai. Apabila tatasusunan input menjadi kosong, fungsi mencetak pilih atur semasa.
Penyelesaian 2: Menggunakan Fungsi Berulang
Sebagai alternatif, pendekatan berulang boleh digunakan untuk menjana pilihatur. Fungsi pc_next_permutation melakukan langkah berikut:
function pc_next_permutation($p, $size) { // slide down the array looking for where we're smaller than the next guy for ($i = $size - 1; $p[$i] >= $p[$i+1]; --$i) { } // if this doesn't occur, we've finished our permutations // the array is reversed: (1, 2, 3, 4) => (4, 3, 2, 1) if ($i == -1) { return false; } // slide down the array looking for a bigger number than what we found before for ($j = $size; $p[$j] <= $p[$i]; --$j) { } // swap them $tmp = $p[$i]; $p[$i] = $p[$j]; $p[$j] = $tmp; // now reverse the elements in between by swapping the ends for (++$i, $j = $size; $i < $j; ++$i, --$j) { $tmp = $p[$i]; $p[$i] = $p[$j]; $p[$j] = $tmp; } return $p; }
Fungsi ini mengambil dua parameter: $p (tatasusunan input) dan $size (panjang tatasusunan input). Ia berulang melalui tatasusunan dalam susunan terbalik, mencari nilai yang kurang daripada elemen seterusnya. Jika tiada nilai tersebut ditemui, ini bermakna pilih atur semasa adalah yang terakhir. Jika tidak, ia menukar nilai dengan yang lebih besar seterusnya dan kemudian membalikkan elemen yang tinggal dalam pilih atur.
Dengan memanggil pc_next_permutation secara berulang pada tatasusunan yang diisih, semua pilih atur yang mungkin boleh dijana. Kod berikut menunjukkan pendekatan ini:
$set = split(' ', 'she sells seashells'); // like array('she', 'sells', 'seashells') $size = count($set) - 1; $perm = range(0, $size); $j = 0; do { foreach ($perm as $i) { $perms[$j][] = $set[$i]; } } while ($perm = pc_next_permutation($perm, $size) and ++$j); foreach ($perms as $p) { print join(' ', $p) . "\n"; }
Atas ialah kandungan terperinci Bagaimanakah saya boleh menjana semua pilih atur yang mungkin bagi tatasusunan rentetan dalam PHP menggunakan kedua-dua pendekatan rekursif dan berulang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!