Não sei se o COBOL funciona (certamente não funcionou ao mesmo tempo), mas também não consigo imaginar alguém se importando muito.
O Fortran possui desde o Fortran 90, mas exige que você use a recursive
palavra-chave para informar que uma sub-rotina é recursiva.
O PL / I era praticamente o mesmo - a recursão era suportada, mas você precisava explicitamente dizer quais procedimentos eram recursivos.
Duvido que haja muito mais que isso. Quando se trata disso, proibir a recursão era principalmente algo que a IBM fazia em seus designs de idiomas, pelo simples motivo de que os mainframes da IBM (360/370/3090 / ...) não suportam uma pilha de hardware. Quando a maioria dos idiomas veio da IBM, eles proibiram a recursão. Agora que todos eles vêm de outros lugares, a recursão é sempre permitida (embora eu deva acrescentar que algumas outras máquinas, principalmente a Cray 1 original, também não tinham suporte de hardware para uma pilha).
notably the original cray 1
Então, você não precisa de recursão para clonar dinossauros? Acho que depende de nós, macacos, passar por entre as árvores.A Wikipedia diz:
http://en.wikipedia.org/wiki/Subroutine#Local_variables.2C_recursion_and_re-entrancy
http://www.ibiblio.org/pub/languages/fortran/ch1-12.html
fonte
A linguagem de programação OpenCL não suporta recursão. (consulte a seção 6.8 das especificações do OpenCL )
A motivação atual para isso é: a) falta de espaço para pilhas profundas; b) desejo de saber, estaticamente, o total de alocações necessárias para otimizar o desempenho na presença de grandes conjuntos de registros e amplo alinhamento.
Isso pode se aplicar a outras linguagens de programação da GPU, por exemplo, linguagens de sombreador.
fonte
Alguns compiladores c para microcontroladores pequenos não suportam recursão, provavelmente porque eles têm um tamanho de pilha extremamente limitado.
fonte
O BASIC, nos dias de números de linha, tendia a ter um suporte insuficiente à recursão. Muitos BASICs (todos?) Da época eram compatíveis com chamadas aninhadas ao gosub, mas não suportavam uma maneira fácil de passar parâmetros ou retornar valores de uma maneira que tornava útil a auto-chamada.
Muitos computadores antigos tiveram problemas com a recursão, porque usaram instruções de chamada que escreveram o endereço de retorno no início da rotina chamada (PDP8, a família de máquinas IAS, provavelmente mais arquiteturas com as quais não estou familiarizado), geralmente de tal maneira que era o código de máquina para "Salte para a instrução após a que chamou a rotina".
fonte
Depende do que você quer dizer com " suporte ". Para dar suporte à recursão, você precisa de uma pilha onde re-instanciar variáveis locais a cada reentrada.
Mesmo se o idioma não tiver o conceito de variáveis locais, se ele tiver o conceito de "sub-rotina" e tiver uma maneira de gerenciar uma indexação entre variáveis idênticas (aka matriz), você poderá aumentar / diminuir um índice global a cada entrada / saída de uma função e acesse através dela um membro de uma ou mais matrizes.
Não sei se isso pode ser chamado de "suporte". Os fatos são que escrevi função recursiva com o ZX-Spectrum BASIC, como fiz no Fortran77 e no COBOL ... sempre com esse truque.
fonte
A linguagem assembly não suporta diretamente a recursão - você precisa "fazer você mesmo", normalmente pressionando parâmetros na pilha da máquina.
fonte
CALL
instrução que empurra o IP automaticamente para a pilha antes de pular para a sub-rotina e umaRET
instrução que insere o endereço de retorno no IP. Não há motivo para você não terCALL
seu próprio ponto de entrada.void f() { f(); }
é recursivo.