Salah satu cara langsung adalah prosedur rekursif yang melakukan hal berikut pada setiap doa. Input ke prosedur adalah daftar pasangan yang telah dipilih dan daftar semua pasangan.
- Hitung angka terkecil yang belum tercakup oleh daftar input. Untuk permohonan pertama, ini akan menjadi 0 tentu saja, karena tidak ada pasangan yang dipilih.
- Jika semua angka tercakup, Anda memiliki kombinasi yang benar, cetak dan kembalikan langkah sebelumnya. Kalau tidak, angka terkecil yang terungkap adalah target yang akan kita tuju.
- Cari melalui pasangan mencari cara untuk menutupi nomor target. Jika tidak ada, maka kembalilah ke tingkat rekursi sebelumnya.
- Jika ada cara untuk menutupi nomor target, pilih cara pertama dan panggil seluruh prosedur secara rekursif lagi, dengan pasangan yang baru saja dipilih menambah ke daftar pasangan yang dipilih.
- Ketika itu kembali, cari cara berikutnya untuk menutupi nomor target dengan pasangan, tanpa tumpang tindih dengan pasangan yang dipilih sebelumnya. Jika Anda menemukan satu, pilih dan ulangi lagi prosedur panggilan berikutnya.
- Lanjutkan langkah 4 dan 5 hingga tidak ada lagi cara untuk menutupi nomor target. Periksa seluruh daftar pasangan. Ketika tidak ada pilihan yang lebih benar, kembali ke level rekursi sebelumnya.
Cara untuk memvisualisasikan algoritma ini adalah dengan pohon yang jalurnya adalah urutan pasangan yang tidak tumpang tindih. Tingkat pertama pohon berisi semua pasangan yang berisi 0. Untuk contoh di atas, pohonnya adalah
Akar
|
----------------
| | |
(0,1) (0,2) (0,3)
| | |
(2,3) (1,3) (1,2)
Dalam contoh ini semua jalur melalui pohon benar-benar memberikan koleksi yang benar, tetapi misalnya jika kita meninggalkan pasangan (1,2) maka jalur paling kanan hanya akan memiliki satu simpul dan akan sesuai dengan pencarian di langkah 3 gagal.
Algoritme pencarian tipe ini dapat dikembangkan untuk banyak masalah yang sama dalam penghitungan semua objek dari tipe tertentu.
Disarankan bahwa mungkin OP berarti bahwa semua pasangan berada di input, bukan hanya satu set dari mereka seperti yang dikatakan dalam pertanyaan. Dalam hal ini algoritma lebih mudah karena tidak perlu lagi memeriksa pasangan mana yang diperbolehkan. Bahkan tidak perlu untuk menghasilkan set semua pasangan; pseudocode berikut akan melakukan apa yang diminta OP. Di sini adalah nomor input, "daftar" dimulai sebagai daftar kosong, dan "tertutup" adalah array dengan panjang diinisialisasi ke 0. Ini bisa dibuat agak lebih efisien tetapi itu bukan tujuan langsung saya.nnn
sub cover {
i = 0;
while ( (i < n) && (covered[i] == 1 )) {
i++;
}
if ( i == n ) { print list; return;}
covered[i] = 1;
for ( j = 0; j < n; j++ ) {
if ( covered[j] == 0 ) {
covered[j] = 1;
push list, [i,j];
cover();
pop list;
covered[j] = 0;
}
}
covered[i] = 0;
}