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
Barbara Streisandasal
2024-12-08 08:57:13896semak imbas

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

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!

Kenyataan:
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