Untuk menjawab pertanyaan spesifik Anda: Tidak, dari sudut pandang belajar bahasa, rekursi bukanlah fitur. Jika profesor Anda benar-benar memberi Anda nilai karena menggunakan "fitur" yang belum dia ajarkan, itu salah.
Membaca yang tersirat, salah satu kemungkinannya adalah dengan menggunakan rekursi, Anda menghindari penggunaan fitur yang seharusnya menjadi hasil pembelajaran untuk kursusnya. Misalnya, mungkin Anda tidak menggunakan iterasi sama sekali, atau mungkin Anda hanya menggunakan for
loop daripada menggunakan keduanya for
dan while
. Merupakan hal yang umum bahwa sebuah tugas bertujuan untuk menguji kemampuan Anda dalam melakukan hal-hal tertentu, dan jika Anda menghindarinya, profesor Anda tidak dapat memberi Anda nilai yang disisihkan untuk fitur tersebut. Namun, jika itu benar-benar penyebab nilai Anda hilang, profesor harus menganggap ini sebagai pengalaman belajarnya sendiri - jika menunjukkan hasil pembelajaran tertentu adalah salah satu kriteria untuk sebuah tugas, yang harus dijelaskan dengan jelas kepada siswa .
Karena itu, saya setuju dengan sebagian besar komentar dan jawaban lain bahwa iterasi adalah pilihan yang lebih baik daripada rekursi di sini. Ada beberapa alasan, dan sementara orang lain telah menyinggungnya sampai batas tertentu, saya tidak yakin mereka telah sepenuhnya menjelaskan pemikiran di baliknya.
Stack Overflows
Yang lebih jelas adalah bahwa Anda berisiko mendapatkan kesalahan stack overflow. Secara realistis, metode yang Anda tulis sangat tidak mungkin benar-benar mengarah ke metode tersebut, karena pengguna harus memberikan masukan yang salah berkali-kali untuk benar-benar memicu luapan tumpukan.
Namun, satu hal yang perlu diingat adalah bahwa tidak hanya metode itu sendiri, tetapi metode lain yang lebih tinggi atau lebih rendah dalam rantai panggilan akan ada di tumpukan. Karena itu, dengan santai melahap ruang tumpukan yang tersedia adalah hal yang sangat tidak sopan untuk dilakukan metode apa pun. Tidak ada yang ingin terus-menerus khawatir tentang ruang tumpukan kosong setiap kali mereka menulis kode karena risiko kode lain mungkin telah menggunakan banyak darinya secara tidak perlu.
Ini adalah bagian dari prinsip yang lebih umum dalam desain perangkat lunak yang disebut abstraksi. Pada dasarnya, saat Anda menelepon DoThing()
, yang perlu Anda perhatikan hanyalah bahwa Sesuatu sudah selesai. Anda tidak perlu khawatir tentang detail implementasi tentang cara melakukannya. Tetapi penggunaan stack yang serakah melanggar prinsip ini, karena setiap bit kode harus mengkhawatirkan tentang berapa banyak stack yang dapat diasumsikannya dengan aman oleh kode di tempat lain di rantai panggilan.
Keterbacaan
Alasan lainnya adalah keterbacaan. Ideal yang harus dicita-citakan oleh kode adalah menjadi dokumen yang dapat dibaca manusia, di mana setiap baris mendeskripsikan apa yang dilakukannya. Ambil dua pendekatan ini:
private int getInput() {
int input;
do {
input = promptForInput();
} while (!inputIsValid(input))
return input;
}
melawan
private int getInput() {
int input = promptForInput();
if(inputIsValid(input)) {
return input;
}
return getInput();
}
Ya, keduanya berfungsi, dan ya keduanya cukup mudah dipahami. Tetapi bagaimana kedua pendekatan tersebut dapat dijelaskan dalam bahasa Inggris? Saya pikir itu akan menjadi seperti:
Saya akan meminta masukan sampai masukan tersebut valid, dan kemudian mengembalikannya
melawan
Saya akan meminta input, kemudian jika inputnya valid saya akan mengembalikannya, jika tidak saya mendapatkan input dan mengembalikan hasilnya sebagai gantinya
Mungkin Anda dapat memikirkan kata-kata yang tidak terlalu kikuk untuk yang terakhir, tetapi saya pikir Anda akan selalu menemukan bahwa yang pertama akan menjadi deskripsi yang lebih akurat, secara konseptual, tentang apa yang sebenarnya Anda coba lakukan. Ini tidak berarti rekursi selalu kurang terbaca. Untuk situasi di mana ia bersinar, seperti penjelajahan pohon, Anda dapat melakukan analisis berdampingan yang sama antara rekursi dan pendekatan lain dan Anda hampir pasti akan menemukan rekursi memberikan kode yang lebih jelas mendeskripsikan dirinya sendiri, baris demi baris.
Dalam isolasi, keduanya adalah poin kecil. Sangat tidak mungkin hal ini akan benar-benar menyebabkan stack overflow, dan peningkatan keterbacaan kecil. Tetapi program apa pun akan menjadi kumpulan dari banyak keputusan kecil ini, jadi meskipun terpisah itu tidak terlalu penting, penting untuk mempelajari prinsip di balik melakukannya dengan benar.