❶ 各位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 結束標識符「#」
自己好好琢磨琢磨吧,其實思想挺簡單的~
❽ 編譯器是怎樣處理遞歸的
這個是需要數據結構的知識,通過不斷的「壓棧」。可以把棧看做是一個水杯。不斷的向這個水杯里放入程序代碼。之後不斷的取棧操作。完成遞歸。由於不斷的壓棧,所以如果遞歸次數多,水杯里的東西越多,越消耗內存。
❾ 編譯器中通常以哪種數據結構處理遞歸程序調用
編譯器中通常以哪種數據結構處理遞歸程序調用
當然是採用棧來處遞歸程序調用