❶ 各位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 结束标识符“#”
自己好好琢磨琢磨吧,其实思想挺简单的~
❽ 编译器是怎样处理递归的
这个是需要数据结构的知识,通过不断的“压栈”。可以把栈看做是一个水杯。不断的向这个水杯里放入程序代码。之后不断的取栈操作。完成递归。由于不断的压栈,所以如果递归次数多,水杯里的东西越多,越消耗内存。
❾ 编译器中通常以哪种数据结构处理递归程序调用
编译器中通常以哪种数据结构处理递归程序调用
当然是采用栈来处递归程序调用