Na teoria da computabilidade, funções computáveis também são chamadas de funções recursivas. Pelo menos à primeira vista, eles não têm nada em comum com o que você chama de "recursivo" na programação do dia-a-dia (isto é, funções que se denominam).
Qual é o significado real de recursivo no contexto da computabilidade? Por que essas funções são chamadas "recursivas"?
Em outras palavras: qual é a conexão entre os dois significados de "recursividade"?
computability
terminology
history
Golo Roden
fonte
fonte
Respostas:
Defina algumas funções básicas:
função zero
função sucessora
função de projeção
A partir de agora vou usar para denotar ( x 1 , x 2 , … , x n )xn¯ (x1,x2,…,xn)
Defina uma composição:
Funções dadas
Construa a seguinte função:
Defina recursão primitiva:
Funções dadas
Construa a seguinte função (por partes):
Todas as funções que podem ser feitas usando composições e recursão primitiva em funções básicas são chamadas recursivas primitivas . É assim chamado por definição. Embora exista um link com funções que se autodenominam, não é necessário tentar vinculá-las. Você pode considerar a recursão um homônimo.
Essa definição e construção acima foram construídas por Gödel (algumas outras pessoas também estavam envolvidas) na tentativa de capturar todas as funções computáveis, ou seja, existe uma Máquina de Turing para essa função. Observe que o conceito de uma máquina de Turing ainda não foi descrito, ou era pelo menos muito vago.
Felizmente, alguém chamado Ackermann apareceu e definiu a seguinte função:
Esta função é computável, mas não há como construí-la usando apenas as construções acima! (ie não é recursivo primitivo) Isso significa que Gödel e seu grupo falharam em capturar todas as funções computáveis em sua construção!Ack
Gödel teve que expandir sua classe de funções de modo poderia ser construído. Ele fez isso definindo o seguinte:Ack
Minimização ilimitada
Este último pode ser difícil de entender, mas basicamente significa que é a menor raiz de f (se existir uma raiz).g((x1,x2,…,xk)) f
Todas as funções que podem ser construídas com todas as construções definidas acima são chamadas recursivas . Novamente, o nome recursivo é apenas por definição e não necessariamente tem correlação com funções que se chamam. Na verdade, considere isso um homônimo.
Funções recursivas podem ser funções recursivas parciais ou funções recursivas totais . Todas as funções recursivas parciais são funções recursivas totais. Todas as funções recursivas primitivas são totais. Como exemplo de uma função recursiva parcial que não é total, considere a minimização da função sucessora. A função sucessora não tem raízes, portanto sua minimização não está definida. Um exemplo de uma função recursiva total (que usa minimização) é .Ack
Agora Gödel foi capaz de construir o função, bem com a sua classe alargada de funções. De fato, toda função que pode ser computada por uma máquina de Turing pode ser representada usando as construções acima e vice-versa, toda construção pode ser representada por uma máquina de Turing.Ack
Se você estiver intrigado, tente aumentar a classe de Gödel. Você pode tentar definir o 'oposto' da minimização ilimitada. Ou seja, maximização ilimitada , ou seja, a função que encontra a maior raiz. No entanto, você pode achar que calcular essa função é difícil (impossível). Você pode ler o problema Busy Beaver , que tenta aplicar a maximização ilimitada.
fonte
Os fundadores da teoria da computabilidade foram matemáticos. Eles fundaram o que agora é chamado de teoria da computabilidade antes de haver computadores. Como os matemáticos definiram as funções que poderiam ser computadas? Por definições recursivas!
Portanto, havia função recursiva antes de qualquer outro modelo de computação, como máquinas de Turing, máquinas de cálculo ou registradoras lambda. Então, as pessoas se referem a essas funções como funções recursivas. O fato de eles terem sido exatamente o que as máquinas de Turing e outros modelos podem calcular é um evento posterior (principalmente provado por Kleene).
O nome do campo usado para a teoria da recursão. No entanto, houve um impulso bem-sucedido nas últimas décadas para mudar o nome para algo mais atraente, da teoria da recursão para algo mais científico (versus mathy). Como resultado, o campo agora é chamado de teoria da computabilidade. No entanto, se você olhar para livros, trabalhos, conferências, etc., nas primeiras décadas, eles serão chamados de teoria da recursão e não de teoria da computabilidade. Até o título do livro de 1987 de Soare (que foi a principal pessoa por trás do impulso de mudar o nome para a teoria da computabilidade) é "Conjuntos e graus recursivamente enumeráveis".
Se você quiser saber mais sobre a história, um lugar divertido e bom para ler sobre ela é o primeiro capítulo da Teoria da Recursão Clássica de Odifreddi.
fonte
Robert Soare escreveu um ensaio sobre esta questão. Segundo ele, o termo funções recursivas (gerais) foi cunhado por Gödel, que as definiu usando algum tipo de recursão mútua. O nome ficou preso, embora mais tarde outras definições equivalentes tenham sido encontradas.
Para mais informações, recomendo o ensaio de Soare.
fonte
em vez de colocar um longo comentário, decidiu adicionar uma resposta:
Como são definidas recursivamente , ou seja, " funções mais complexas são definidas em termos de funções mais simples definidas anteriormente "
Esse tipo de procedimento iterativo ou incremental cria funções bem definidas (no sentido matemático)
Este é o significado de recursividade na linguagem matemática. Veja abaixo como isso se relaciona com a recursão na linguagem de programação.
Compare este procedimento com técnicas e métodos como indução (matemática), que também é um exemplo de recursividade na matemática.
A programação tem uma veia matemática e também uma de engenharia.
Esse procedimento (geralmente construtivo) também é chamado de " bootstrapping " na linguagem dos sistemas operacionais.
No entanto, uma recursão em tempo de execução da mesma função (ou seja, se auto-calibrando durante o tempo de execução ), uma vez que deve (hmm, deveria) ocorrer em valores (ou argumentos) já calculados ou, em outras palavras, na parte do conjunto de resultados já calculado , também é recursivo no sentido acima, ou seja, " funções definidas previamente definidas (e seus valores) "
Outra coisa não está bem definida e leva a coisas como Stack Overflow :))))
Para dar um exemplo adicional de Sistemas operacionais, uma recursão de tempo de execução (chamada própria) pode ser tomada como o análogo de um sistema operacional reinicializado após uma certa atualização (por exemplo, atualização principal). Muitos sistemas operacionais fazem o seguinte procedimento:
Auberon bela resposta de demonstra um procedimento desse tipo em mais detalhes.
fonte