Rumah > pembangunan bahagian belakang > tutorial php > Bagaimanakah saya boleh menjana semua pilih atur yang mungkin bagi tatasusunan rentetan dalam PHP menggunakan kedua-dua pendekatan rekursif dan berulang?

Bagaimanakah saya boleh menjana semua pilih atur yang mungkin bagi tatasusunan rentetan dalam PHP menggunakan kedua-dua pendekatan rekursif dan berulang?

Barbara Streisand
Lepaskan: 2024-12-08 08:57:13
asal
881 orang telah melayarinya

How can I generate all possible permutations of an array of strings in PHP using both recursive and iterative approaches?

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
Salin selepas log masuk

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);
         }
    }
}
Salin selepas log masuk

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;
}
Salin selepas log masuk

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";
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan