계산 함수가 재귀 함수라고도하는 이유는 무엇입니까?


23

계산 이론에서 계산 가능한 함수는 재귀 함수라고도합니다. 적어도 첫눈에 그들은 일상 프로그래밍에서 "재귀 적"이라고 부르는 것과 공통점이 없습니다 (즉, 스스로 호출하는 함수).

계산의 맥락에서 재귀의 실제 의미는 무엇입니까? 왜 이러한 기능을 "재귀"라고합니까?

다른 말로 표현하자면 : "재 귀성"의 두 의미 사이에는 어떤 관련이 있습니까?



3
그들은 μ 연산자 를 포함하기 때문에 속임수 입니다. 이것은 최소화 연산자이지만 물론 최소화는 재귀와 관련이 거의 없습니다. 그래서 누군가 (Kleene)는 "재귀적인"것이 좋을 것이라고 생각한 것 같습니다. 그래서 그는 그 이름을 사용하는 것에 대한 변명을 발명했습니다. 나중에 로버트 소어 (Robert Soare)는 "계산 가능"이 훨씬 더 잘 들리며 "재귀"는 초기의 마케팅 트릭 일 뿐이라고 모두 동의했다.
Thomas Klimpel

3
원시 재귀 함수에 대해? 위키피디아에서 복사 한 문자h(0,x1,,xk)=f(x1,,xk)h(S(y),x1,,xk)=g(y,h(y,x1,,xk),x1,,xk) . 그것은 스스로를 호출하는 함수입니다.
Hendrik Jan

3
@GoloRoden 'computability'(이 질문에 사용)의 태그 설명은 "computability theory aka recursion theory"라고 말합니다. 고델은 함수를 재귀 라고 부르지 만, 그 용어는 계산 가능한 것으로 진화했다 . 아마 당신과 같은 혼란을 피하기 위해. 계산 이론을 집중적으로 연구하는 사람들은 재귀 이론이라는 용어를 근본을 '존중'하기 위해 더 많이 사용하는 경향이 있습니다.
Auberon

1
이것들은 재귀 적으로 정의되기 때문에, " 더 복잡한 함수는 이전에 정의 된 더 간단한 함수로 정의됩니다 "
Nikos M.

답변:


13

몇 가지 기본 기능을 정의하십시오.

  • 제로 기능

    zero:NN:x0
  • 후속 기능

    succ:NN:xx+1
  • 프로젝션 기능

pin:NnN:(x1,x2,,xn)xi

이제부터는 을 사용하여 (x1,x2,,xn)xn¯(x1,x2,,xn)

구성을 정의하십시오.

주어진 기능

  • g1,g2,,gm 각각 서명NkN
  • f:NmN

다음 함수를 구성하십시오.

h:NkN:xk¯h(xk¯)=f(g1(xk¯),g2(xk¯),,gm(xk¯))

원시 재귀를 정의하십시오.

주어진 기능

  • f:NkN
  • g:Nk+2N

다음과 같은 기능을 구성하십시오.

h:Nk+1N:(xk¯,y+1){f(xk¯),y+1=0g(xk¯,y,h(xk¯,y)),y+1>0

이용 될 수있는 모든 기능 조성물프리미티브 재귀기본적인 기능은 ,라고 프리미티브 재귀 . 그것은 정의에 의해 그런 식으로 불립니다. 스스로 호출하는 함수와의 링크가 존재하지만 서로 연결하려고 시도 할 필요는 없습니다. 재귀를 동음이라고 생각할 수 있습니다.

위의 정의와 구성은 계산 가능한 모든 기능, 즉 해당 기능에 대한 튜링 머신이 존재하는 모든 기능을 포착하기 위해 고델 (Gödel)에 의해 구성되었습니다. 튜링 머신의 개념은 아직 설명되지 않았거나 최소한 모호한 점에 유의하십시오.

불행히도 Ackermann이라는 사람이 와서 다음 기능을 정의했습니다.

  • Ack:N2N
  • Ack(0,y)=y+1
  • Ack(x+1,0)=Ack(x,1)
  • Ack(x+1,y+1)=Ack(x,Ack(x+1,y))

이 함수는 계산 가능하지만 위의 구성 만 사용하여 구성 할 수는 없습니다! (즉, 는 원시 재귀가 아닙니다) 이것은 Gödel과 그의 소유가 구성에서 계산 가능한 모든 기능을 캡처하지 못했음을 의미합니다!Ack

Gödel은 구성 할 수 있도록 자신의 기능 클래스를 확장해야했습니다 . 그는 다음을 정의하여이를 수행했습니다.Ack

무한한 최소화

  • g:NkN
  • IF THEN ELSE 가 정의되어 있지 않습니다.[f(xk¯,y)=0 AND f(xk¯,z) is defined z<y AND f(xk¯,z)0]

    g(xk¯)=y

    g(xk¯)

이 마지막 것은 이해하기 어려울 수 있지만 기본적으로 는 의 가장 작은 루트 (루트가 존재하는 경우)를 의미합니다.g((x1,x2,,xk))f


위에 정의 된 모든 구성으로 구성 할 수있는 모든 기능을 재귀 라고 합니다. 다시 말하지만, 재귀 라는 이름 은 정의에 의한 것일 뿐이며 반드시 자신을 호출하는 함수와 상관 관계가있는 것은 아닙니다. 진실로, 그것을 동음이라고 생각하십시오.

재귀 함수는 부분 재귀 함수 이거나 전체 재귀 함수일 수 있습니다. 모든 부분 재귀 함수는 전체 재귀 함수입니다. 모든 원시 재귀 함수는 총계입니다. 전체가 아닌 부분 재귀 함수의 예로 후속 함수의 최소화를 고려하십시오. 후속 함수에는 근이 없으므로 최소화는 정의되지 않습니다. 전체 재귀 함수의 예 (최소화 사용)는 입니다.Ack

이제 Gödel은 확장 된 함수 클래스를 사용 하여 함수 를 구성 할 수있었습니다 . 사실, Turing machine으로 계산할 수있는 모든 기능은 위의 구성을 사용하여 표현할 수 있으며 그 반대의 경우도 마찬가지입니다. 모든 구성은 Turing machine으로 표현할 수 있습니다.Ack

흥미가 있다면 Gödel의 수업을 더 크게 만들 수 있습니다. 무한한 최소화의 '반대'를 정의 할 수 있습니다. 즉, 무한한 최대화, 즉 가장 큰 근을 찾는 함수입니다. 그러나 해당 기능을 계산하는 것이 어렵다는 것을 알 수 있습니다. 당신은에 읽을 수 있습니다 바쁜 비버 문제 , 시도 무제한의 극대화를 적용 할 수 있습니다.


4
주어진 정의가 실제로 그 질문에 답하지는 않는다는 것을 알고 있지만, 내 대답은 재귀 / 계산 이론의 진화를 설명합니다. 읽을만한 가치가 있습니다.
Auberon

나는 당신의 노력에 감사합니다 :-)
Golo Roden

h((x1,x2,...,xk),0)=f((x1,x2,...,xk))h((x1,x2,...,xk,0)). 또한 다음 글 머리 기호의 else 절 이전에는 then 절이 없습니다.
Eric Towers

2
μ

1
귀하의 답변에 상당히 잘못된 진술이 있습니다. 답변에 대한 기록을 작성해서는 안됩니다.
Kaveh

17

계산 이론의 창시자들은 수학자였다. 그들은 컴퓨터가 있기 전에 지금 계산 이론이라고하는 것을 설립했습니다. 수학자들이 계산할 수있는 함수를 정의한 방법은 무엇입니까? 재귀 정의로!

따라서 튜링 머신이나 람다 미적분학 또는 레지스터 머신과 같은 다른 계산 모델이 있기 전에 재귀 함수가있었습니다. 따라서 사람들은이 함수를 재귀 함수라고합니다. 그들이 튜링 머신과 다른 모델이 계산할 수있는 정확한 것으로 판명되었다는 사실은 차후의 사건입니다 (주로 Kleene에 의해 입증 됨).

μ

재귀 이론에 사용되는 필드의 이름입니다. 그러나 최근 수십 년 동안 이름을 재귀 이론에서 컴퓨터 과학 (vs. mathy)으로 더 호소력있는 것으로 바꾸려는 성공적인 추진이있었습니다. 결과적으로이 필드는 이제 계산 성 이론이라고합니다. 그러나 초기 수십 년 동안 책, 논문, 회의 등을 보면 재귀 이론이라고하며 계산 이론은 아닙니다. Soare의 1987 년 저서 (계산 이론으로 이름을 바꾸려는 주도적 인 인물)의 제목조차도 "재귀 적으로 열거 가능한 집합 및 학위"입니다.

역사에 대해 더 알고 싶다면 재미 있고 좋은 곳을 읽으십시오 .Odifreddi의 고전 재귀 이론의 첫 번째 장입니다.


7

Robert Soare는 이 문제에 대한 에세이 를 썼습니다 . 그에 따르면, (일반적인) 재귀 함수라는 용어는 일종의 상호 재귀를 사용하여 정의한 Gödel에 의해 만들어졌습니다. 나중에 다른 동등한 정의에서 발견되었지만 이름이 붙어 있습니다.

자세한 내용은 Soare의 에세이를 권장합니다.


0

긴 의견을 제시하는 대신 답변을 추가하기로 결정했습니다.

그것들은 재귀 적 으로 정의 되기 때문에 " 더 복잡한 함수는 이전에 정의 된 더 간단한 함수의 관점에서 정의됩니다 "

이러한 종류의 반복 또는 증분 절차는 잘 정의 된 함수를 생성 합니다 (수학적 의미에서).

이것이 수학적 관점에서 재귀 의 의미입니다 . 프로그래밍 언어에서의 재귀와 관련이있는 방법을 아래에서 참조하십시오.

이 과정을 수학 의 재귀의 예인 (수학적) 유도 와 같은 기술 및 방법과 비교하십시오 .

프로그래밍에는 공학적인 것뿐만 아니라 수학적 정맥도 있습니다.

이 (보통 건설적인) 절차는 운영 체제 용어에서 " 부트 스트래핑 " 이라고도 합니다.

그러나 동일한 함수 의 런타임 재귀 는 (즉 , 런타임 중에 자체 계산) 이미 계산 된 값 (또는 인수) 또는 다른 말로하면 이미 계산 된 결과 집합 에서 발생해야하기 때문에 (hmm)해야합니다 . 또한 위의 의미에서 재귀 적입니다. 즉, " 정의 된 wrt 이전에 정의 된 함수 (및 해당 값) "

그렇지 않으면 잘 정의되어 있지 않으며 Stack Overflow :)))))

운영 체제의 추가 예를 제공하기 위해 런타임 재귀 (호출 자체)는 특정 업데이트 (예 : 코어 업데이트) 후 운영 체제 재부팅 의 아날로그로 간주 할 수 있습니다 . 많은 OS가 다음 절차를 수행합니다.

  1. 저수준 루틴 (예 : I / O)을로드하기위한 초기 부팅
  2. 필요한 업데이트 수행 (낮은 수준의 루틴 사용)
  3. 재부트 (효과적으로 자체 호출)하지만 이번에는 더 복잡한 루틴 (또는 전체 시스템)을로드합니다.

Auberon의 아름다운 답변은 이러한 종류의 절차를보다 자세히 보여줍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.