導航:首頁 > 源碼編譯 > 編譯遞歸程序

編譯遞歸程序

發布時間:2022-01-20 00:13:12

❶ 各位C語言高手,小弟剛學C語言,想用遞歸編程求N階和編譯時報錯,請多多指教!!!

1 #include<stdio.h>
2 int sn(int j)
3 {
4 if(j==1)
5 return 1;
6 else
7 return j*sn(j-1);
8 }
9 int sorce(int n)
10 {
11 int tn1,i,sum=0;
12 for(i=1;i<=n;i++)
13 {
14 tn1=sn(i);
15 sum=sum+tn1;
16 }
17 return sum;
18 }
19 int main()
20 {
21 int n=3;
22 printf("%d\n",sorce(n));
23 }

你程序bug太多了,sn 怎麼可能又定義函數 又定義變數呢,遞歸用的也不對阿

❷ 編譯原理考察文法為其編制遞歸子程序完成語法分析

你真慘 要考這個
我覺得在這問會的人不多

❸ 編譯原理,遞歸下降子程序語法分析

沒學過編譯原理,看描述,是讓寫一個腳本執行軟體。
終結符我查了下,就是不可再分的。比如iε。
輸入是EGTSFI*/ε組成的字元串。
規則需要預處理。注意轉意符在字元串中的效果。因為有/字元。

不會c或c++,只會c#。你可以到貼吧發帖。強人工智慧吧 就挺好。演算法吧有點亂。

最重要的,不要錢。

❹ 編譯遞歸下降分析法

#include <stdio.h>
#include<dos.h>
#include<stdlib.h>
#include<string.h>

char a[50] ,b[50],d[200],e[10];
char ch;
int n1,i1=0,flag=1,n=5;

int E();
int E1();
int T();
int G();
int S();
int F();
void input();
void input1();
void output();

void main() /*遞歸分析*/
{
int f,p,j=0;
char x;
d[0]='E';
d[1]='=';
d[2]='';
d[3]='T';
d[4]='G';
d[5]='#';
printf("請輸入字元串(長度<50,以#號結束)\n");
do{
scanf("%c",&ch);
a[j]=ch;
j++;
}while(ch!='#');
n1=j;
ch=b[0]=a[0];
printf("文法\t分析串\t\t分析字元\t剩餘串\n");
f=E1();
if (f==0) return;
if (ch=='#')
{ printf("accept\n");
p=0;
x=d[p];
while(x!='#') {
printf("%c",x);p=p+1;x=d[p]; /*輸出推導式*/
}
}
else {
printf("error\n");
printf("回車返回\n");
getchar();getchar();
return;
}
printf("\n");
printf("回車返回\n");
getchar();
getchar();
}

int E1()
{ int f,t;
printf("E--TG\t");
flag=1;
input();
input1();
f=T();
if (f==0) return(0);
t=G();
if (t==0) return(0);
else return(1);
}

int E()
{ int f,t;
printf("E--TG\t");
e[0]='E';e[1]='=';e[2]='';e[3]='T';e[4]='G';e[5]='#';
output();
flag=1;
input();
input1();
f=T();
if (f==0) return(0);
t=G();
if (t==0) return(0);
else return(1);
}

int T()
{ int f,t;
printf("T--FS\t");
e[0]='T';e[1]='=';e[2]='';e[3]='F';e[4]='S';e[5]='#';
output();
flag=1;
input();
input1();
f=F();
if (f==0) return(0);
t=S();
if (t==0) return(0);
else return(1);
}

int G()
{ int f;
if(ch=='+') {
b[i1]=ch;
printf("G--+TG\t");
e[0]='G';e[1]='=';e[2]='';e[3]='+';e[4]='T';e[5]='G';e[6]='#';
output();
flag=0;
input();input1();
ch=a[++i1];
f=T();
if (f==0) return(0);
G();
return(1);
}
printf("G--^\t");
e[0]='G';e[1]='=';e[2]='';e[3]='^';e[4]='#';
output();
flag=1;
input();input1();
return(1);
}

int S()
{
int f,t;
if(ch=='*') {
b[i1]=ch;printf("S--*FS\t");
e[0]='S';e[1]='=';e[2]='';e[3]='*';e[4]='F';e[5]='S';e[6]='#';
output();
flag=0;
input();input1();
ch=a[++i1];
f=F();
if (f==0) return(0);
t=S();
if (t==0) return(0);
else return(1);}
printf("S--^\t");
e[0]='S';e[1]='=';e[2]='';e[3]='^';e[4]='#';
output();
flag=1;
a[i1]=ch;
input();input1();
return(1);
}

int F()
{ int f;
if(ch=='(') {
b[i1]=ch;printf("F--(E)\t");
e[0]='F';e[1]='=';e[2]='';e[3]='(';e[4]='E';e[5]=')';e[6]='#';
output();
flag=0;
input();input1();
ch=a[++i1];
f=E();
if (f==0) return(0);
if(ch==')') {
b[i1]=ch;printf("F--(E)\t");
flag=0;input();input1();
ch=a[++i1];
}
else {
printf("error\n");
return(0);
}
}
else if(ch=='i') {
b[i1]=ch;printf("F--i\t");
e[0]='F';e[1]='=';e[2]='';e[3]='i';e[4]='#';
output();
flag=0;input();input1();
ch=a[++i1];
}
else {printf("error\n");return(0);}
return(1);
}

void input()
{
int j=0;
for (;j<=i1-flag;j++)
printf("%c",b[j]); /*輸出分析串*/
printf("\t\t");
printf("%c\t\t",ch); /*輸出分析字元*/
}

void input1()
{
int j;
for (j=i1+1-flag;j<n1;j++)
printf("%c",a[j]); /*輸出剩餘字元*/
printf("\n");
}

void output(){ /*推導式計算*/
int m,k,j,q;
int i=0;
m=0;k=0;q=0;
i=n;
d[n]='=';d[n+1]='';d[n+2]='#';n=n+2;i=n;
i=i-2;
while(d[i]!=''&&i!=0) i=i-1;
i=i+1;
while(d[i]!=e[0]) i=i+1;
q=i;
m=q;k=q;
while(d[m]!='') m=m-1;
m=m+1;
while(m!=q) {
d[n]=d[m];m=m+1;n=n+1;
}
d[n]='#';
for(j=3;e[j]!='#';j++){
d[n]=e[j];
n=n+1;
}
k=k+1;
while(d[k]!='=') {
d[n]=d[k];n=n+1;k=k+1;
}
d[n]='#';
}

這是我們用到的程序,看看對你有沒有幫助。
至於下面的兩個問題,很簡單,可以容易做出來吧!
不會可以和我交流!
祝 進步!

❺ c語言編譯---遞歸倒置字元數組

#include<stdio.h>

main()
{
int n,a[100];
scanf("%d %s",&n,&a);
f(a,n,0);
system("pause");
}

f(char *a,int n,int i)
{
char c;
if(i>=n/2||n==1)printf("\n\n%s\n\t",a);
else{
c=a[i];a[i]=a[n-i-1];a[n-i-1]=c;
i++;
printf("\n%s",a);
f(a,n,i);
}
}

❻ 一個簡單的C語言程序,包含遞歸。我對遞歸不是太懂,求詳解遞歸過程及結果。關鍵要的是遞歸過程。

分析過程:

根據遞歸函數分析:
p(w) = p(w-1) w p(w-1)

p(3) = p(2) 3 p(2)
p(2) = p(1) 2 p(1)
p(1) = p(0) 1 p(0)

由於p(0)不會輸出任何字元,故
p(2) = p(0) 1 p(0) 2 p(0) 1 p(0)
= 1 2 1
p(3) = p(2) 3 p(2)
= 1 2 1 3 1 2 1

❼ 求解編譯原理題 構造遞歸下降分析程序

兄弟,其實這個問題不難,只是我感覺你給的問題不完全,不知道怎麼給你解決,要不我給你個遞歸下降分析方法分析文法的例子吧,你先看看。我估計你看了這個後絕對就明白整體的分析思想了~
文法如下:
S->do s1 begin s2 end while s2
s1->s2mB
s2->AmB
A->B
B->VAL //VAL是所有非關鍵字的字元字元組和數字
m->+|-|*|/|>|<|=

/////////////*語法遞歸分析*/////////////////
int B(int * c,int & q)
{
if(c[q]==13)
{ q++;
return 1;
}
else if(c[q]==5)
{ q++;
return 1;
}
else {cout<<"error 'B'"<<endl;return 0;}
}

int A(int * b,int & o)
{
if(B(b,o))
{
return 1;
}
else {cout<<"error 'A'"<<endl;return 0;}
}
int OP(int *r,int & v)
{
if(r[v]==6)
{
v++;
return 1;
}
else if(r[v]==7)
{
v++;
return 1;
}
else if(r[v]==8)
{
v++;
return 1;
}
else if(r[v]==9)
{
v++;
return 1;
}
else if(r[v]==10)
{
v++;
return 1;
}
else if(r[v]==11)
{
v++;
return 1;
}
else if(r[v]==12)
{
v++;
return 1;
}
else {cout<<"error 'OP'"<<endl;return 0;}
}
int S2(int * d,int & h)
{
if(A(d,h))
{
if(OP(d,h))
{
if(B(d,h))
return 1;
else {cout<<"條件語句右部出錯 "<<endl;return 0;}
}
else {cout<<"條件語句缺少運算符 "<<endl;return 0;}
}
else {cout<<"條件語句左部出錯 "<<endl;return 0;}
}

int S1(int * d,int & h)
{
if(S2(d,h))
{
if(OP(d,h))
{
if(B(d,h))

return 1;
else {cout<<"循環語句右部出錯 "<<endl;return 0;}
}
else {cout<<"循環語句缺少運算符 "<<endl;return 0;}
}
else {cout<<"循環語句左部出錯 "<<endl;return 0;}
}

int S(int *a,int & z)
{
if (a[z++]==1)
{
if (S1(a,z))
{
if (a[z++]==2)
{
if (S2(a,z))
{
if(a[z++]==3)
{
if(a[z++]==4)
{
if(S2(a,z))
{
cout<<"語法分析成功!"<<endl;
return 1;
}
else return 0;
}
else {cout<<"error 'while'"<<endl; return 0;}
}
else {cout<<"error 'end'"<<endl; return 0;}
}
else return 0;
}
else {cout<<"error 'begin'"<<endl; return 0;}
}
else return 0;
}
else {cout<<"error 'do'"<<endl; return 0;}
}
/////////////////////// 語法分析結束 ////////////////////////

詞法分析中單詞代號 詞法分析中可識別到的所有單詞
1 do
2 begin
3 end
4 while
5 除關鍵字以外的所有字元或字元串
6 +
7 -
8 *
9 /
10 =
11 >
12 <
13 數字
14 結束標識符「#」

自己好好琢磨琢磨吧,其實思想挺簡單的~

❽ 編譯器是怎樣處理遞歸的

這個是需要數據結構的知識,通過不斷的「壓棧」。可以把棧看做是一個水杯。不斷的向這個水杯里放入程序代碼。之後不斷的取棧操作。完成遞歸。由於不斷的壓棧,所以如果遞歸次數多,水杯里的東西越多,越消耗內存。

❾ 編譯器中通常以哪種數據結構處理遞歸程序調用

編譯器中通常以哪種數據結構處理遞歸程序調用

當然是採用棧來處遞歸程序調用

閱讀全文

與編譯遞歸程序相關的資料

熱點內容
學信網app為什麼刷臉不了 瀏覽:871
天蠍vs程序員 瀏覽:991
單片機下載口叫什麼 瀏覽:186
程序員的道 瀏覽:924
雲伺服器不實名違法嗎 瀏覽:556
怎樣查看文件夾圖片是否重復 瀏覽:993
文件怎麼導成pdf文件 瀏覽:805
打開sql表的命令 瀏覽:101
安卓手機如何面部支付 瀏覽:37
天元數學app為什麼登錄不上去 瀏覽:822
明日之後為什麼有些伺服器是四個字 瀏覽:102
安卓系統l1是什麼意思 瀏覽:24
伺服器一直崩應該用什麼指令 瀏覽:922
cm202貼片機編程 瀏覽:729
php構造函數帶參數 瀏覽:178
解壓電波歌曲大全 瀏覽:345
為啥文件夾移到桌面成word了 瀏覽:859
命令符的安全模式是哪個鍵 瀏覽:760
編程中學 瀏覽:957
單片機求助 瀏覽:995