Saya memiliki pemahaman dasar yang baik tentang dasar-dasar C ++, saya juga memiliki pemahaman tentang bagaimana rekursi bekerja juga. Saya menemukan masalah tertentu seperti masalah delapan ratu klasik dan memecahkan Sudoku dengan Backtracking.
Saya menyadari bahwa saya cukup tersesat dalam hal ini, saya sepertinya tidak dapat mengalihkan pikiran tentang konsep kembali ke tumpukan rekursi dan memulai lagi untuk menyelesaikan masalah. Tampaknya mudah dengan pena dan kertas tetapi ketika harus menulis kode untuk ini, saya bingung bagaimana cara mulai menyerang masalah ini.
Akan sangat membantu jika ada tutorial yang ditujukan untuk pemula untuk melakukan backtracking atau jika ada buku bagus yang membahas hal ini. Jika seseorang dapat menjelaskan topik ini atau memberi saya beberapa tautan ke referensi yang layak, saya akan sangat berterima kasih.
Dan ya saya tahu bahwa itu akan lebih mudah dalam bahasa fungsional tetapi saya ingin memahami implementasi dalam bahasa imperatif juga.
Jawaban:
Di mundur, Anda tidak memulai lagi. Sebaliknya, Anda beralih melalui semua opsi pada situasi saat ini.
Pikirkan tentang menemukan solusi untuk labirin. Pada satu titik di mana Anda memiliki dua jalur berbeda, Anda coba yang kiri terlebih dahulu. Jika yang kiri tidak membawa Anda ke jalan keluar, Anda kembali ke titik dan mencoba jalur lainnya. Begitulah cara backtracking bekerja. Dalam 8 Q dan masalah lain di mana backtracking dapat digunakan, bagian yang membingungkan ada di domain masalah - bagaimana cara mengulangi pilihan Anda dalam situasi tertentu dengan cara deterministik.
EDIT : berikut ini adalah kode semu yang membantu memahami penelusuran ulang.
Untuk pertanyaan 8Q:
sumber
Anda telah melihat program berjalan pohon biner, kan? Ini terlihat seperti ini:
Ini pengunduran diri Anda.
Anda sebenarnya tidak membutuhkan pohon fisik. Yang Anda butuhkan adalah cara untuk bergerak dan kemudian membatalkannya, atau memberi tahu apakah Anda menang, atau memberi tahu apakah Anda tidak bisa melangkah lebih jauh.
sumber
else{return walk(p->left)||walk(p->right));}
tidak perlu untuk melempar hasil yang diharapkan