C 포인터 원리(40) - 반복(1)
4578 단어 설계와 구조
귀속은 컴퓨터 과학에서 함수의 정의에서 함수 자체를 사용하는 방법을 가리킨다. 귀속은 순환을 진행하는 기교(클래스 lisp 등 함수 언어에서도 순환을 실현하는 주요하고 심지어 유일한 경로, 예를 들어 아래의 LISP 코드)이다.
1、
페포나시 수열(이탈리아어: Successione di Fibonacci)은 페포나치 수, 페포나치 수열, 페씨 수열, 황금분할 수열을 번역한다.
수학적으로 페포나시 수열은 귀속적인 방법으로 정의된다.
귀속은 페포나시 수열 계산을 완성하는 방법 중의 하나로 페포나시 수열은 0과 1에서 시작하고 그 후의 페포나시 계수는 이전의 두 수를 더한다.
, rainfuck 해석기 C 언어 구현
Brainfuck은 1993년에 Urban Müller가 만든 컴퓨터 언어로 매우 소형화된 언어이다.간단하고 최소한의 컴파일러로 실현할 수 있는 도령의 완전한 사상에 부합되는 프로그래밍 언어이런 언어는 8가지 연산자로 구성되어 있는데brainfuck의 계산 방식은 이처럼 남다르다. 간단한 기계 모델을 바탕으로 지령을 제외하고 이 기계는 바이트 단위, 0으로 초기화된 수조, 이 수조를 가리키는 바늘(처음에 수조를 가리키는 첫 번째 바이트), 그리고 입력과 출력에 사용되는 두 바이트 흐름을 포함한다.
다음은 각 상태를 문자로 식별하는 8가지 상태에 대한 설명입니다.
문자
속뜻
포인터 플러스 1
<
포인터 하나 빼기
포인터가 가리키는 바이트의 값을 더하기
포인터가 가리키는 바이트의 값을 1로 줄이다
.
포인터가 가리키는 셀 컨텐트 내보내기(ASCII 코드)
,
포인터가 가리키는 장치로 컨텐트 입력(ASCII 코드)
[
포인터가 가리키는 단원 값이 0이면, 대응하는 명령의 다음 명령으로 뒤로 이동합니다
]
만약 포인터가 가리키는 단원의 값이 0이 아니라면, 대응하는 [지령의 다음 지령으로 앞으로 이동합니다
이 페이지에서 이 언어와 관련된 내용을 찾을 수 있습니다.http://www.muppetlabs.com/~breadbox/bf/, 이 사이트 주소는 간단하고 효율적인 brainfuck 해석기 소스 코드를 제공합니다. 코드에는 수조, 바늘 등 C 바늘의 응용이 포함됩니다.
우선, 이 해석기를 완성하면 이 프로그램은 필요한 변수에 대해 다음과 같이 설명한다.
1. 배열 변수
char a[5000], f[5000]
그중
#include
int p, r, q;
char a[5000], f[5000], b, o, *s=f;
void interpret(char *c)
{
char *d; int tmp;
r++;
while( *c ) {
//if(strchr("<>+-,.[]
",*c))printf("%c",*c);
switch(o=1,*c++) {
case '': p++; break;
case '+': a[p]++; break;
case '-': a[p]--; break;
case '.': putchar(a[p]); fflush(stdout); break;
case ',':
tmp=getchar();
if (tmp == EOF) a[p]=0;
else a[p]=tmp;
break;
case '[':
for( b=1,d=c; b && *c; c++ )
b+=*c==’[’, b-=*c==’]’;
if(!b) {
c[-1]=0;
while( a[p] )
interpret(d);
c[-1]=’]’;
break;
}
case ‘]’:
puts(“UNBALANCED BRACKETS”), exit(0);
default: o=0;
}
if( p<0 || p>100)
puts(“RANGE ERROR”), exit(0);
}
r–;
}
int main(int argc,char *argv[])
{
FILE *z;
q=argc;
if((z=fopen(argv[1],“r”))) {
while( (b=getc(z))>0 )
*s++=b;
*s=0;
interpret(f);
}
return 0;
}
1. 다음fib 함수는 C 언어의 실현이고 함수는 자신의 실현 계산을 반복적으로 호출한다.
위 절차를 수행합니다.
#include
long fib_n(long,long,int);
int main(){
fib_n(0, 1, 40);
return 0;
}
int i=0;
long fib_n(long curr,long next,int n) {
printf ("% d 항목:% ld", i++,curr);
if (n == 0) {
return curr;
} else {
return fib_n(next, curr+next, n-1);
}
}
실행 프로그램에서main은 40을 매개 변수 n의 값으로 하고fib를 호출하여fib가 전 41개의 페포나시 계수의 값을 계속 출력한다. 또한 수열의 41개수(첫 번째 수 0은 첫 번째 항목이 아니라 0번째 항목이기 때문이다).
dp@dp:~ % gcc fib.c -o fib
dp@dp:~ % ./fib
항목 0: 0
항목1: 1
항2: 1
항목 3: 2
항목 4: 3
항목 5: 5
항목 6: 8
항목 7:13
항:21
제 9항:34
10항:55
제11항:89
제12항:144
제13항:233
제14항:377
항목 15: 610
제16항:987
항목 17: 1597
제18항:2584
제19항:4181
제20항:6765
제21항:10946
제22항:17711
제23항:28657
제24항:46368
제25항:75025
제26항:121393
제27항:196418
제28항:317811
제29항:514229
항목 30: 832040
제31항:1346269
항목 32: 2178309
제33항:3524578
제34항:5702887
제 35 항: 9227465
제 36 항: 14930352
제37항:24157817
제38항:39088169
제 39 항: 63245986
항목 40: 102334155
그 알고리즘은 다음과 같이 설명할 수 있다.
(1)fib 함수는 수열이 0이 되지 않을 때 귀속 상태에 들어가 자신(즉fib)을 반복적으로 호출한다.
이 과정은 모두fib함수를 호출하지만 매번 호출되는 매개 변수는 반드시 하나의 연설을 하지 않는다. 매번 호출되는 함수마다 새로운 매개 변수를fib함수에 전송하고 매번fib함수의 집행에 필요한 매개 변수는 지난번fib함수가 집행 과정에서 전달되기 때문이다.또한 함수의 매개 변수 전달 방식은 함수에 속하는 창고를 통해 이루어진다. 이것은 여러 차례fib 함수를 반복적으로 호출하지만 매개 변수는 이번fib 함수 집행에서만 사용되고 사용이 끝난 후에 창고 공간에서 이번에 사용된 매개 변수를 방출한다는 것을 의미한다.fib는 fib 자체에 대해 끊임없이 호출합니다 (코드의 "fib n (next,curr+next,n-1)"))) 매번 호출할 때마다fibn 함수,curr 매개 변수는 성장 중 (curr 매개 변수는 수열의 현재 항목을 표시하고, 초기 값은 0, 매번 새 값은next) 이며,next 매개 변수도 증가 중입니다. (next 매개 변수는 수열의 다음 항목을 표시합니다. 초기 값은 1, 매번 새 값은curr+next)n 매개 변수는 감소 중입니다. (n은 하나의 계수기입니다. 이 계수기는 0이 되어야 끝납니다. 매번 1이 감소하고 n의 초기 값은 40입니다. n은 생성된 페포나시 수열의 수를 제어합니다.)
(2) n값이 0일 때 모든fib 함수에 대한 호출이 끝났고 생성된 페파나시수의 수량은 프로그램 요구에 도달했다.수열의 시작점(코드의'n==0')에서 마지막fib 함수를 호출하여 완성하면 함수는 프로그램이 요구하는 수열의 마지막 수의 계산(코드의'return curr;')을 되돌려줍니다.이때의curr는102334155)이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 포인터 원리(40) - 반복(1)만약 포인터가 가리키는 단원의 값이 0이 아니라면, 대응하는 [지령의 다음 지령으로 앞으로 이동합니다 int p, r, q; char a[5000], f[5000], b, o, *s=f; void interpret(...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.