当前位置:文档之家› c语言递归实现最大公约数源码

c语言递归实现最大公约数源码

c语言递归实现最大公约数源码
c语言递归实现最大公约数源码

求最大公约数

//递归代码

#include

int gcd(int x,int y);

main ()

{

int x,y ;

printf("请输入两个正整数(n1,n2):\n");

scanf("%d,%d",&x,&y);

printf("%d,%d的最大公约数是:%d\n",x,y,gcd(x,y));

return(0);

}

int gcd(int x,int y)

{

int t;

if(x

{

t=x;

x=y;

y=t;

}

if(x%y==0)

return y;

else

return gcd(y,x%y);

}

//非递归代码

#include

int main()

{

int m,n;

printf("请输入两个正整数(n1,n2):\n");

scanf("%d,%d",&m,&n);

while(m!=n)

{

if(m>n)

m=m-n;

else

n=n-m;

}

printf("两个数的最大公约数是%d\n",m); return 0;

}

C语言-函数

C语言(函数,变量作用范围)二 1 C语言程序由函数组成,以下说法正确的是( A ). A)主函数可以在其它函数之前,函数内不可以嵌套定义函数 B)主函数可以在其它函数之前,函数内可以嵌套定义函数 C)主函数必须在其它函数之前,函数内不可以嵌套定义函数 D)主函数必须在其它函数之前,函数内可以嵌套定义函数 2 以下说法中不正确的是( A )。 A) 主函数main中定义的变量在整个文件或程序中有效 B) 不同的函数中可以使用相同名字的变量 C) 形式参数是局部变量 D) 在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效 3 下面函数 f(double x) {printf(“%6d\n”,x);} 的类型为( C ). A) 实型B)void 类型C)int 类型 D) A)、B)、C)均不正确 4 以下说法中正确的是( C ). A)C语言程序总是从第一个定义的函数开始执行 B)在C语言程序中,要调用的函数必须在main函数中定义 C)C语言程序总是从main函数开始执行 D)C语言程序中,main函数必须放在程序的开始部分 5 以下正确的函数定义是( C ). A) double fun(int x,int y); {int z; z=x+y; return z;} B) fun(int x,y) {int z; return z;} C) double fun(int x,int y) {double z; z=x+y; return z;} D) double fun( x, y) {int x,y; double z; z=x+y; return z;} 6 定义为void类型的函数,其含义是( A ). A)调用函数后,被调用的函数没有返回值 B)调用函数后,被调用的函数不返回 C)调用函数后,被调用的函数的返回值为任意的类型 D)以上三种说法都是错误的

C语言函数习题及答案

第6章函数习题 一、选择题 1. 一个完整的C源程序是【】。 A)要由一个主函数或一个以上的非主函数构成 B)由一个且仅由一个主函数和零个以上的非主函数构成 C)要由一个主函数和一个以上的非主函数构成 D)由一个且只有一个主函数或多个非主函数构成 2. 以下关于函数的叙述中正确的是【】。 A)C语言程序将从源程序中第一个函数开始执行 B)可以在程序中由用户指定任意一个函数作为主函数,程序将从此开始执行 C)C语言规定必须用main作为主函数名,程序将从此开始执行,在此结束 D)main可作为用户标识符,用以定义任意一个函数 3. 以下关于函数的叙述中不正确的是【】。 A)C程序是函数的集合,包括标准库函数和用户自定义函数 B)在C语言程序中,被调用的函数必须在main函数中定义 C)在C语言程序中,函数的定义不能嵌套 D)在C语言程序中,函数的调用可以嵌套 4. 在一个C程序中,【】。 A)main函数必须出现在所有函数之前 B)main函数可以在任何地方出现 C)main函数必须出现在所有函数之后 D)main函数必须出现在固定位置 5. 若在C语言中未说明函数的类型,则系统默认该函数的数据类型是【】 A)float B)long C)int D)double 6. 以下关于函数叙述中,错误的是【】。 A)函数未被调用时,系统将不为形参分配内存单元 B)实参与形参的个数应相等,且实参与形参的类型必须对应一致 C)当形参是变量时,实参可以是常量、变量或表达式 D)形参可以是常量、变量或表达式 7. C程序中各函数之间可以通过多种方式传递数据,下列不能用于实现数据传递的方式是【】。 A)参数的形实(哑实)结合 B)函数返回值 C)全局变量 D)同名的局部变量 8. 若函数调用时参数为基本数据类型的变量,以下叙述正确的是【】。 A)实参与其对应的形参共占存储单元 B)只有当实参与其对应的形参同名时才共占存储单元 C)实参与对应的形参分别占用不同的存储单元 D)实参将数据传递给形参后,立即释放原先占用的存储单元 9. 函数调用时,当实参和形参都是简单变量时,他们之间数据传递的过程是【】。 A)实参将其地址传递给形参,并释放原先占用的存储单元 B)实参将其地址传递给形参,调用结束时形参再将其地址回传给实参 C)实参将其值传递给形参,调用结束时形参再将其值回传给实参

C语言函数递归[1]

递归,作为C语言最经典的算法之一,是一种非常有用的程序设计方法。虽然用递归算法编写的程序结构清晰,具有很好的可读性,还往往使某些看起来不易解决的问题变得容易解决。但在递归函数中,由于存在着自调用过程,程序控制反复进入其自身,使程序的分析设计有一定困难,致使很多初学者往往对递归迷惑不解,也在这上面花了不少的时间,却收效甚微。那么,究竟什么是递归?怎么实现递归呢? 所谓递归,简而言之就是在调用一个函数的过程中又直接或间接地调用该函数本身,以实现层次数据结构的查询和访问。在函数中直接调用函数本身,称为直接递归调用。在函数中调用其它函数,其它函数又调用原函数,这就构成了函数自身的间接调用,称为间接递归调用。 而采用递归方法来解决问题,必须符合以下三个条件: 1、可以把要解决的问题转化为一个新问题,而这个新的问题的解决方法仍与原来的解决方法相同,只是所处理的对象有规律地递增或递减。 说明:解决问题的方法相同,调用函数的参数每次不同(有规律的递增或递减),如果没有规律也就不能适用递归调用。 2、可以应用这个转化过程使问题得到解决。 说明:使用其他的办法比较麻烦或很难解决,而使用递归的方法可以很好地解决问题 3、必定要有一个明确的结束递归的条件。 说明:一定要能够在适当的地方结束递归调用。不然可能导致系统崩溃。 好知道是这样以后;我们来写一个众多教材上的程序:使用递归的方法求n!。 当n>1时,求n!的问题可以转化为n*(n-1)!的新问题。比如n=4: 第一部分:4*3*2*1 n*(n-1)! 第二部分:3*2*1 (n-1)(n-2)! 第三部分:2*1 (n-2)(n-3)! 第四部分:1 (n-4)! 4-4=0,得到值1,结束递归。 我给的源程序如下: #include int fac(int n) {int c; printf("now the number is %d ",n); getchar(); if(n==1 || n==0) c=1; else c=n*fac(n-1); printf("now the number is %d and the %d! is %d",n,n,c); getchar();

c语言递归函数示例

1.编写计算X的Y次幂的递归函数getpower(int x,int ),并在主程序中实现输入输出。#include"stdio.h" long getpower(int x,int y) { if(y==1) return x; else return x*getpower(x,y-1); } void main() { int num,power; long answer; printf("please input a number:"); scanf("%d",&num); printf("please input the number's power series:"); scanf("%d",&power); answer=getpower(num,power); printf("结果是:%ld\n",answer); } 结果说明:输入61再输入5求得61的5次幂为844596301. 2编写计算学生年龄的递归函数。 #include int age(int n) { int c; if(n==1) c=10; else c=age(n-1)+2; return c; } void main() { int n=5; printf("the five student'sage is:%d years old\n",age(n)); }

结果说明:第五个学生的年龄为18岁。 3.编写递归函数实现Ackman函数。 #include Acm(int m,int n) { if(m==0) return n+1; else if(n==0) return Acm(m-1,1); else return Acm(m-1,Acm(m,n-1)); } int main() { printf("Acm(2,1)=%d\n",Acm(2,1)); printf("Acm(3,2)=%d\n",Acm(3,2)); return 0; } 结果说明:利用递归函数求得Acm(2,1)=5,Acm(3,2)=29. 实验小结:

C语言函数练习题及答案

1 【单选题】 在下列关于C函数定义的叙述中,正确的是??A、 函数可以嵌套定义,但不可以嵌套调用; ? ?B、 函数不可以嵌套定义,但可以嵌套调用; ? ?C、 函数不可以嵌套定义,也不可以嵌套调用; ? ?D、 函数可以嵌套定义,也可以嵌套调用; ? 我的答案:B得分:2.5分 2 【单选题】 下面函数调用语句含有实参的个数为? nc((exp1,exp2),(exp3,exp4,exp5)); ?A、 1 ? ?B、 2

? ?C、 4 ? ?D、 5 ? 我的答案:B得分:2.5分 3 【单选题】 C语言中函数返回值的类型是由以下哪个选项决定的??A、 函数定义时指定的类型; ? ?B、 return语句中的表达式类型; ? ?C、 调用该函数时的实参的数据类型; ? ?D、 形参的数据类型; ? 我的答案:A得分:2.5分 4 【单选题】

以下关于函数叙述中,错误的是? ?A、 函数未被调用时,系统将不为形参分配内存单元; ? ?B、 实参与形参的个数必须相等,且实参与形参的类型必须对应一致; ? ?C、 当形参是变量时,实参可以是常量、变量或表达式; ? ?D、 如函数调用时,实参与形参都为变量,则这两个变量不可能共享同一内存空间; ? 我的答案:B得分:2.5分 5 【单选题】 若函数调用时参数为基本数据类型的变量,以下叙述正确的是? ?A、 实参与其对应的形参共享内存存储单元; ? ?B、 只有当实参与其对应的形参同名时才共享内存存储单元; ? ?C、 实参与对应的形参分别占用不同的内存存储单元; ?

实参将数据传递给形参后,立即释放原先占用的内存存储单元; ? 我的答案:C得分:2.5分 6 【单选题】 函数调用时,实参和形参都是简单变量,它们之间数据传递的过程描述正确的是??A、 实参将地址传递给形参,并释放原先占用的存储单元; ? ?B、 实参将地址传递给形参,调用结束时形参再将此地址回传给实参; ? ?C、 实参将值传递给形参,调用结束时形参再将其值回传给实参; ? ?D、 实参将值传递给形参,调用结束时形参并不将其值回传给实参; ? 我的答案:D得分:2.5分 7 【单选题】 若用数组名作为函数调用的实参,则传递给形参的是? ?A、 数组第一个元素的地址; ?

c语言_递归下降分析程序实验_共13页

实验二递归下降语法分析程序的设计与实现 、实验目的:加深对语法分析器工作过程的理解;加强对递归下降法实现语法分析程序的掌握;能够采用一种编程语言实现简单的语法分析程序;能够使用自己编写的分析程序对简单的程序段进行语法翻译。 、实验内容:在实验1的基础上,用递归下降分析法编制语法分析程序,语法分析程序的实现可以采用任何一种编程工具。 三、实验要求: 1.对语法规则有明确的定义; 2.编写的分析程序能够进行正确的语法分析; 3.*对于遇到的语法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成语法分析过程; 4.实验报告要求用文法的形式对语法定义做出详细说明,说明语法分析程序的工作过程,说明错误处理的实现*。 四、实验学时:4学时 五、实验步骤: 1.定义目标语言的语法规则; 2.根据语法规则输入语句段,用递归下降分析的方法进行语法分析,直到结束; 3.*对遇到的语法错误做出错误处理。 六、实验内容: 1.编程实现给定文法的递归下降分析程序。 E—T|E+T T—F|T*F F—(E)|i

2.(参考课本P74)对文法先进行消除左递归。 3.分析程序由一组递归过程组成,文法中每个非终结符对应一个过程几个全局过程和变量: ADVANCE,把输入串指示器IP指向下一个输入符号,即读入一个单字符号 SYM,IP当前所指的输入符号 ERROR,出错处理子程序 每个非终结符有对应的子程序的定义,首先在分析过程中,当需要从某个非终结符出发进行展开(推导)时,就调用这个非终结符对应的子程序。 4.具体实现时: 当遇到终结符,编写:if (当前读到的输入符号=i) 读入下一个输入符号 当遇到非终结符E时,编写语句:调用E() 当遇到E-->编写语句if (当前读到的输入符号不属于Follow (E)) Error(); (4)当某个非终结符的规则有多个候选式时,按LL(1)文法的条件能唯一的选择一个候选式进行推导。 #in elude using n ames pace std; char 〃字符串的存入 a[80]; char sym; 〃单个的判断字符 int //字符串下标 i=0; void //功能识别函数 E(); void //功能识别函数 E2(); void //功能识别函数 T(); void //功能识别函数 T2();

c语言函数

用递归法将一个正整数n的各个数字分别输出int f(int num) { int x; if(num==0) return 0; else{ x=num%10;

f(num/10); } 穷举实例 int main() { int n=1,m,sum,i; while(1) { m=n; sum=0; for(i=1;i<8;i++) { m=m*2; sum=m+sum; } sum=sum+n; if(sum==765) { cout<<"fist"<

break; } n++; } return 0; } 宏定义可以定义函数例如交换函数swap #Define swap(a,b){int c;c=a;a=b;b=c;} 简单结构体成员号码姓名 #include "StdAfx.h" #include"stdio.h" #include"string.h"

#include"iostream" using namespace std; struct student { int num; char name[50]; struct student *next; }; struct student *creat(int n) { int i; struct student *head,*p1,*p2; int num1; char name1[50]; head=NULL; for(i=n;i>0;--i) { p1=(struct student* )malloc(sizeof(struct student)); cout<<"输入编号";

C语言函数练习题及答案

C语言函数练习题及答案

1 【单选题】 在下列关于C函数定义的叙述中,正确的是? ?A、 函数可以嵌套定义,但不可以嵌套调用; ? ?B、 函数不可以嵌套定义,但可以嵌套调用; ? ?C、 函数不可以嵌套定义,也不可以嵌套调用; ? ?D、 函数可以嵌套定义,也可以嵌套调用; ? 我的答案:B得分:2.5分 2 【单选题】 下面函数调用语句含有实参的个数为? nc((exp1,exp2),(exp3,exp4,exp5));

?A、 1 ? ?B、 2 ? ?C、 4 ? ?D、 5 ? 我的答案:B得分:2.5分 3 【单选题】 C语言中函数返回值的类型是由以下哪个选项决定的? ?A、 函数定义时指定的类型; ? ?B、

return语句中的表达式类型; ? ?C、 调用该函数时的实参的数据类型; ? ?D、 形参的数据类型; ? 我的答案:A得分:2.5分 4 【单选题】 以下关于函数叙述中,错误的是? ?A、 函数未被调用时,系统将不为形参分配内存单元; ? ?B、 实参与形参的个数必须相等,且实参与形参的类型必须对应一致; ? ?C、 当形参是变量时,实参可以是常量、变量或表达式; ?

?D、 如函数调用时,实参与形参都为变量,则这两个变量不可能共享同一内存空间; ? 我的答案:B得分:2.5分 5 【单选题】 若函数调用时参数为基本数据类型的变量,以下叙述正确的是? ?A、 实参与其对应的形参共享内存存储单元; ? ?B、 只有当实参与其对应的形参同名时才共享内存存储单元; ? ?C、 实参与对应的形参分别占用不同的内存存储单元; ? ?D、 实参将数据传递给形参后,立即释放原先占用的内存存储单元; ? 我的答案:C得分:2.5分

C语言实验报告,含递归(带程序)

一、写一个函数int digit(int n,int k),它返回数n的从右边向左的第k个十进数字位值。例如,函数调用digit(1234,2)将返回值3。 二、写一个函数int isprime(int n),当n是质数时,函数返回非零值;当n是合数时,函数返回零值。 三、写一个函数reverse(char s[]),将字符串s[]中的字符存储位置颠倒后重新存于s[]中。试分别用递归和非递归两种形式编写。 四、写一个主函数输入测试数据(自己指定),并调用上述函数,检查函数功能的正确性。要求:把预备知识、步骤、程序框图、调试好的程序及存在的问题写在下面(不够可以附页)。 #include #include int digit(int n,int k); int isprime(int n); void reverse(char s[]); //非递归实现 void reverse1(char s[]); //递归实现 int digit(int n,int k) { int m1,m2,i; m1=n; m2=0; while(m1!=0) //统计n数字的位数 { m1=m1/10; m2=m2+1; } if(k<=0||k>m2) return 0; //不能正确截取 m1=n; for(i=1;in/2) return 1; else

C语言程序设计 递归调用的概念

7.3.1递归调用的概念 函数的递归调用指的是一个函数执行过程中出现了直接或间接调用函数本身的调用方式。如果直接调用函数本身称为直接递归;如果调用了另外一个函数,那个函数又调用该函数,则称为间接递归。 递归方法的基本思想是将一个问题向下分解具有同样解决方法但规模不断缩小的子问题,不断进行这样的分解,直到分解的子问题有一个已知解。下面通过一个例子来讲解递归的概念。 例如,某数列为k(n)的定义为: 1n=1 k(n)=2×k(n-1)n为偶数 3×k(n-1)n为奇数 求该数列的第四项k(4)。 从以上数列的定义来看,该数列的任何一项均受前一项的约束,在求解k(4)时,首先要求解k(3),要求解k(3)就必须先知道k(2)的值,k(2)的值取决于k(1)的值。由于k(1)的值是已知的,然后再由k(1)反推回去计算k(2),k(3),k(4),得到K(4)的值。求解过程可以用图7-2表示。 k(4)=k(3)×2 k(3)=k(2)×3 k(2)=k(1)×2 k(1)=1k(2)=1×2=2 k(3)=2×3=6 k(4)=6×2=12 图7-2回推和递推过程 从图7-2可以看出,求解过程分为两个阶段:第一阶段是“回推”,将第4个值表示为第3个值的函数,将第3个值表示为第2个值的函数,再回推到第1个,而k(1)是已知的,到达了递归的边界。第二阶段使用“递推”,从已知的第1个值推出第2个值,从第2个值推出第3个值,从第3个值就推出了第4个值。整个的回推和递推过程就称为递归过程。 可以用一个函数描述上面的递归过程: int k(int n)/*递归计算函数*/ { int m;/*m存放函数的返回值*/ if(n==1)m=1; else if(n%2==0)m=k(n-1)*2;/*调用自身,n为偶数*/ else m=k(n-1)*3;/*调用自身,n为奇数*/ return(m);

C语言函数定义、调用,递归函数

C语言程序设计实验报告 实验5 函数程序设计 班级学号姓名 一、实验目的 (1)掌握C语言函数定义及调用的规则; (2)掌握递归函数的编写方法和运行过程; (3)理解变量的作用域和生存期。 二、补充知识: 怎样模拟计算机“想”一个数呢?用随机函数rand() 产生[0,RAND_MAX] 之间的随机数magic = rand();RAND_MAX是在stdlib.h中定义,不大于双字节整数的最大值32767 ,所以使用前加 #include 产生[0,b-1] 之间的随机数 ◆magic = rand()%b; 产生[a,a+b-1] 之间的随机数 ◆magic = rand()%b + a; rand()产生的数据是一串伪随机序列,要实现真正的随机化,用srand()函数播种种子: ◆#include ◆srand(time(NULL)); ◆magic = rand() % 100 + 1; 二、实验内容及步骤 1、程序改错 输入已编好的源程序,源程序中包含有错误,先对源程序进行编译和连接,然后根据提示信息,修改程序中的错误,经过多次修改—编译—连接,直到编译、连接成功。最后运行程序,输出正确结果。 (1)下述程序中,函数FUN功能是:计算正整数NUM的各位上的数字之积。例如,若输入252,则输出应该是20;若输入202,则输出应该是0。 #include /*提示:有3处错误*/ #include long fun(num) {long k=1; do {k*=num%10; num\=10; }while (num) return k; } void main() {long n; scanf(“%ld”,&n); printf(“\n%ld\n”,fun(n)); }

相关主题
文本预览
相关文档 最新文档