Hampir setiap artikel yang saya dapat temukan tentang rekursi mencakup contoh-contoh Angka Fibonacci atau Faktorial, yaitu:
- Matematika
- Tidak berguna dalam kehidupan nyata
Apakah ada beberapa contoh kode non-matematika yang menarik untuk mengajarkan rekursi?
Saya sedang memikirkan algoritma divide-and-menaklukkan tetapi mereka biasanya melibatkan struktur data yang kompleks.
Jawaban:
Struktur direktori / file adalah contoh terbaik dari penggunaan rekursi, karena semua orang memahaminya sebelum Anda mulai, tetapi segala sesuatu yang melibatkan struktur mirip pohon akan berhasil.
sumber
Cari hal-hal yang melibatkan struktur pohon. Sebuah pohon relatif mudah untuk dipahami, dan keindahan solusi rekursif menjadi jauh lebih cepat daripada dengan struktur data linier seperti daftar.
Hal-hal untuk dipikirkan:
Ini semua terkait dengan skenario dunia nyata yang sebenarnya, dan semuanya dapat digunakan dalam aplikasi yang memiliki signifikansi dunia nyata.
sumber
https://stackoverflow.com/questions/105838/real-world-examples-of-recursion
https://stackoverflow.com/questions/2085834/how-did-you-practically-use-recursion
https://stackoverflow.com/questions/4945128/what-is-a-good-example-of-recursion-other-than-generating-a-fibonacci- berikutnyaence
https://stackoverflow.com/questions/126756/examples-of-recursive-functions
sumber
Inilah beberapa masalah yang lebih praktis yang muncul di benak saya:
sumber
QuickSort akan menjadi yang pertama yang terlintas dalam pikiran. Pencarian biner juga merupakan masalah rekursif. Di luar itu, ada seluruh kelas masalah yang solusinya hampir gratis ketika Anda mulai bekerja dengan rekursi.
sumber
Sortir, didefinisikan secara rekursif dalam Python.
Gabungkan, didefinisikan secara rekursif.
Pencarian linier, didefinisikan secara rekursif.
Pencarian biner, didefinisikan secara rekursif.
sumber
Dalam arti tertentu, rekursi adalah tentang pemecahan yang membagi dan menaklukkan, yaitu mengubah ruang masalah menjadi yang lebih kecil untuk membantu menemukan solusi untuk masalah yang sederhana, dan kemudian biasanya kembali merekonstruksi masalah asli untuk menyusun jawaban yang tepat.
Beberapa contoh tidak melibatkan matematika untuk mengajarkan rekursi (setidaknya masalah yang saya ingat dari tahun-tahun universitas saya):
Ini adalah contoh menggunakan Backtracking untuk menyelesaikan masalah.
Masalah lain adalah klasik dari domain Artificial Intelligence: Menggunakan Depth First Search, pathfinding, planning.
Semua masalah itu melibatkan semacam struktur data "kompleks", tetapi jika Anda tidak ingin mengajarinya dengan matematika (angka) maka pilihan Anda mungkin lebih terbatas. Yoy mungkin ingin mulai mengajar dengan struktur data dasar, seperti Daftar yang ditautkan. Misalnya mewakili bilangan asli menggunakan Daftar:
0 = daftar kosong 1 = daftar dengan satu simpul. 2 = daftar dengan 2 node. ...
kemudian tentukan jumlah dua angka dalam hal struktur data ini seperti ini: Kosong + N = N Node (X) + N = Node (X + N)
sumber
Menara Hanoi adalah yang bagus untuk membantu belajar rekursi.
Ada banyak solusi untuk itu di web dalam berbagai bahasa.
sumber
Detektor Palindrome:
Mulailah dengan string: "ABCDEEDCBA" Jika karakter awal & akhir sama, maka ulangi dan centang "BCDEEDCB", dll ...
sumber
Algoritma pencarian biner terdengar seperti apa yang Anda inginkan.
sumber
Dalam bahasa pemrograman fungsional, ketika tidak ada fungsi tingkat tinggi yang tersedia, rekursi digunakan sebagai ganti pengulangan untuk menghindari keadaan yang bisa berubah.
F # adalah bahasa fungsional yang tidak murni yang memungkinkan kedua gaya jadi saya akan membandingkan keduanya di sini. Berikut ini jumlah semua angka dalam daftar.
Imperative Loop dengan Mutable Variable
Lingkaran Rekursif dengan Tidak Berubah
Perhatikan bahwa agregasi semacam ini ditangkap dalam fungsi tingkat tinggi
List.fold
dan dapat ditulis sebagaiList.fold (+) 0 xlist
atau bahkan lebih sederhana dengan fungsi kenyamananList.sum
sebagai adilList.sum xlist
.sumber
Saya sering menggunakan rekursi dalam bermain game AI. Menulis di C ++, saya menggunakan serangkaian sekitar 7 fungsi yang saling memanggil secara berurutan (dengan fungsi pertama memiliki opsi untuk mem-bypass semua itu dan memanggil rantai 2 fungsi lainnya). Fungsi terakhir dalam rantai mana pun disebut fungsi pertama lagi sampai kedalaman yang ingin saya cari pergi ke 0, dalam hal ini fungsi akhir akan memanggil fungsi evaluasi saya dan mengembalikan skor posisi.
Berbagai fungsi memungkinkan saya untuk dengan mudah melakukan percabangan berdasarkan keputusan pemain atau kejadian acak dalam game. Saya akan menggunakan pass-by-reference kapan pun saya bisa, karena saya sedang membagikan struktur data yang sangat besar, tetapi karena bagaimana game itu disusun, sangat sulit untuk memiliki "undo move" dalam pencarian saya, jadi Saya akan menggunakan pass-by-value dalam beberapa fungsi untuk menjaga data asli saya tidak berubah. Karena itu, beralih ke pendekatan berbasis loop daripada pendekatan rekursif terbukti terlalu sulit.
Anda dapat melihat garis besar yang sangat mendasar dari program semacam ini, lihat https://secure.wikimedia.org/wikipedia/en/wiki/Minimax#Pseudocode
sumber
Contoh kehidupan nyata yang sangat baik dalam bisnis adalah sesuatu yang disebut "Bill of Material". Ini adalah data yang mewakili semua komponen yang membentuk produk jadi. Misalnya, mari kita gunakan Sepeda. Sepeda memiliki setang, roda, bingkai, dll. Dan masing-masing komponen dapat memiliki sub-komponen. misalnya Roda dapat memiliki Jari-jari, batang katup, dll. Jadi biasanya ini direpresentasikan dalam struktur pohon.
Sekarang untuk menanyakan informasi agregat tentang BOM atau mengubah elemen dalam BOM sering kali Anda melakukan rekursi.
Dan contoh panggilan rekursif ...
Tentunya Kelas BomPart akan memiliki lebih banyak bidang. Anda mungkin perlu mencari tahu berapa banyak komponen plastik yang Anda miliki, berapa banyak tenaga yang diperlukan untuk membangun bagian yang lengkap, dll. Semua ini kembali ke kegunaan Rekursi pada struktur pohon.
sumber
Hubungan keluarga menjadi contoh yang baik karena semua orang memahaminya secara intuitif:
sumber
||
untukOR
.Rekursi yang agak tidak berguna namun menunjukkan bekerja dengan baik adalah rekursif
strlen()
:Tidak ada matematika - fungsi yang sangat sederhana. Tentu saja Anda tidak menerapkannya secara rekursif dalam kehidupan nyata, tetapi ini adalah demo rekursi yang bagus.
sumber
Masalah rekursi dunia nyata lain yang mungkin berhubungan dengan siswa adalah membangun perayap web mereka sendiri yang menarik informasi dari situs web dan mengikuti semua tautan di dalam situs itu (dan semua tautan dari tautan itu, dll).
sumber
Saya memecahkan masalah dengan pola ksatria (di papan catur) menggunakan program rekursif. Anda seharusnya menggerakkan kesatria itu sehingga menyentuh setiap kotak kecuali beberapa kotak yang ditandai.
Anda hanya:
Banyak jenis skenario "berpikir-depan" dapat dikerjakan dengan menguji kemungkinan di masa depan dalam pohon seperti ini.
sumber