TL; DR: Apakah bahasa fungsional menangani rekursi lebih baik daripada yang non-fungsional?
Saat ini saya sedang membaca Kode Selesai 2. Pada titik tertentu dalam buku ini, penulis memperingatkan kita tentang rekursi. Dia mengatakan itu harus dihindari bila memungkinkan dan bahwa fungsi menggunakan rekursi umumnya kurang efektif daripada solusi menggunakan loop. Sebagai contoh, penulis menulis fungsi Java menggunakan rekursi untuk menghitung faktorial dari angka seperti itu (mungkin tidak persis sama karena saya tidak memiliki buku dengan saya saat ini):
public int factorial(int x) {
if (x <= 0)
return 1;
else
return x * factorial(x - 1);
}
Ini disajikan sebagai solusi buruk. Namun, dalam bahasa fungsional, menggunakan rekursi sering kali merupakan cara yang disukai untuk melakukan sesuatu. Misalnya, inilah fungsi faktorial di Haskell menggunakan rekursi:
factorial :: Integer -> Integer
factorial 0 = 1
factorial n = n * factorial (n - 1)
Dan diterima secara luas sebagai solusi yang baik. Seperti yang telah saya lihat, Haskell sangat sering menggunakan rekursi, dan saya tidak melihat di mana pun hal itu disukai.
Jadi pertanyaan saya pada dasarnya adalah:
- Apakah bahasa fungsional menangani rekursi lebih baik daripada yang non-fungsional?
EDIT: Saya sadar bahwa contoh yang saya gunakan bukan yang terbaik untuk menggambarkan pertanyaan saya. Saya hanya ingin menunjukkan bahwa Haskell (dan bahasa fungsional pada umumnya) menggunakan rekursi lebih sering daripada bahasa non-fungsional.
factorial n = product [1..n]
lebih ringkas, lebih efisien, dan tidak meluap tumpukan untuk besar n
(dan jika Anda membutuhkan memoisasi, opsi yang sama sekali berbeda diperlukan). product
didefinisikan dalam hal beberapa fold
, yang adalah didefinisikan secara rekursif, tetapi dengan sangat hati-hati. Rekursi adalah solusi yang dapat diterima sebagian besar waktu, tetapi masih mudah untuk melakukannya dengan salah / suboptimal.