Saya tidak yakin COBOL melakukannya (tentu saja tidak pada satu waktu), tetapi saya tidak bisa membayangkan siapa pun yang peduli.
Fortran sudah sejak Fortran 90, tetapi mengharuskan Anda menggunakan recursive
kata kunci untuk memberi tahu bahwa subrutin bersifat rekursif.
PL / Saya hampir sama - rekursi didukung, tetapi Anda harus secara eksplisit mengatakannya prosedur apa yang bersifat rekursif.
Saya ragu ada lebih banyak dari itu. Saat Anda melakukannya, melarang rekursi sebagian besar adalah sesuatu yang dilakukan IBM dalam desain bahasa mereka, karena alasan sederhana bahwa mainframe IBM (360/370/3090 / ...) tidak mendukung tumpukan perangkat keras. Ketika sebagian besar bahasa berasal dari IBM, mereka kebanyakan melarang rekursi. Sekarang mereka semua berasal dari tempat lain, rekursi selalu diperbolehkan (meskipun saya harus menambahkan bahwa beberapa mesin lain, terutama Cray 1 asli, tidak memiliki dukungan perangkat keras untuk tumpukan juga).
notably the original cray 1
Jadi, Anda tidak perlu rekursi untuk mengkloning dinosaurus? Saya kira itu terserah kita monyet untuk berayun melalui pepohonan.Wikipedia mengatakan:
http://en.wikipedia.org/wiki/Subroutine#Local_variables.2C_recursion_and_re-entrancy
http://www.ibiblio.org/pub/languages/fortran/ch1-12.html
sumber
Bahasa pemrograman OpenCL tidak mendukung rekursi. (lihat bagian 6.8 dari Spesifikasi OpenCL )
Motivasi saat ini untuk itu adalah a) kurangnya ruang untuk tumpukan yang dalam b) keinginan untuk mengetahui, secara statis, total alokasi yang diperlukan untuk mengoptimalkan kinerja di hadapan set register besar dan in-lining yang luas.
Ini mungkin berlaku untuk bahasa pemrograman GPU lainnya, misalnya bahasa shader.
sumber
Beberapa c compiler untuk mikrokontroler kecil tidak mendukung rekursi, mungkin karena mereka memiliki ukuran stack yang sangat terbatas.
sumber
BASIC, pada zaman bilangan garis, cenderung memiliki dukungan rekursi yang buruk. Banyak (semua?) DASAR waktu itu mendukung panggilan gosub bersarang, tetapi tidak mendukung cara mudah melewati parameter atau mengembalikan nilai dengan cara yang membuatnya berguna untuk melakukan panggilan sendiri.
Banyak komputer awal memiliki masalah dengan rekursi, karena mereka menggunakan instruksi panggilan yang menulis alamat kembali ke awal rutin yang disebut (PDP8, keluarga mesin IAS, mungkin lebih banyak arsitektur yang saya tidak terbiasa dengan), biasanya dengan cara seperti itu adalah kode mesin untuk "Lompat ke instruksi setelah yang memanggil rutin".
sumber
Itu tergantung pada apa yang Anda maksud dengan " dukungan ". Untuk mendukung rekursi, Anda perlu tumpukan tempat instantiate variabel lokal di setiap masuk kembali.
Bahkan jika bahasa tidak memiliki konsep variabel lokal, jika memiliki konsep "subrutin" dan memiliki cara untuk mengelola pengindeksan antara variabel identik (alias array), Anda dapat menambah / mengurangi indeks global pada setiap masuk / keluar dari suatu fungsi dan akses melalui itu anggota dari satu atau lebih array.
Saya tidak tahu apakah ini bisa disebut "dukungan". Faktanya adalah bahwa saya menulis fungsi rekursif dengan ZX-Spectrum BASIC, seperti yang saya lakukan di Fortran77 seperti pada COBOL ... selalu dengan trik itu.
sumber
Bahasa assembly tidak secara langsung mendukung rekursi - Anda harus "melakukannya sendiri", biasanya dengan mendorong parameter ke tumpukan mesin.
sumber
CALL
instruksi, yang secara otomatis mendorong IP ke stack sebelum melompat ke subrutin, danRET
instruksi yang muncul alamat pengirim ke IP. Tidak ada alasan Anda tidak bisaCALL
memasukkan titik masuk Anda sendiri.void f() { f(); }
bersifat rekursif.