当前位置:文档之家› C语言函数定义、调用,递归函数

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

C语言函数定义、调用,递归函数
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));

}

修改后程序代码:

2、编写程序模拟掷骰子游戏。已知掷骰子游戏的游戏规则为:每个骰子有6面,这些面包含1、2、

3、

4、

5、6个点,掷两枚骰子之后,计算点数之和。如果第一次掷的点数和为7或11,则游戏者获胜;如果第一次掷的点数和为2、3或12,则游戏者输;如果第一次掷的点数和为4、5、

6、8、9或10,则将这个和作为游戏者获胜需要掷出的点数,继续投骰子,直到掷到该点数时算是游戏者获胜。如果投掷7次仍未掷到该点数,则游戏者输。

#include "stdio.h"

#include "stdlib.h"

#include "conio.h"

#include "time.h"

enum {CONTINUE,WON,LOST};

void main()

{ int status=CONTINUE;

int i=0,j=0,add,k;

srand((unsigned)time(NULL));

while(i==0)

i=rand()%6;

printf("1: %d\n",i);

while(j==0)

j=rand()&6;

printf("2: %d\n",j);

add=i+j;

if(add==11 || add==7)

status=WON;

if(add==2 || add==3 || add==12)

status=LOST; if(status==WON)

printf("You Win!\n");

else if(status==LOST)

printf("YOU LOST!\n");

else

{ for(k=1;k<=7;k++)

{ i=0;

j=0;

printf("***************%d****************\n",k);

while(i==0)

i=rand()%6;

printf("1: %d\n",i);

while(j==0)

j=rand()%6;

printf("2: %d\n",j);

if((i+j)==add)

{

status=WON;

break; }

}

if(status==WON)

printf("YOU WIN!\n");

else

printf("YOU LOST!\n");

}

getch();

}

3. 递归程序设计练习——计算最大公约数

利用计算最大公约数的三条性质,用递归方法计算两个整数的最大公约数。

性质1:如果x>y,则x和y的最大公约数与x-y和y的最大公约数相同性质2:如果y>x,则x和y的最大公约数与x和y-x的最大公约数相同性质3:如果x=y,则x和y的最大公约数与x值和y值相同,即

具体要求:

①主函数中随机输入x、y的值

②所有变量定义为整数变量。

③键盘输入数据前要有提示。

④要求用函数求最大公约数。

程序代码:

递归调用详解,分析递归调用的详细过程

递归调用详解,分析递归调用的详细过程 2009年05月23日星期六 22:52 一、栈 在说函数递归的时候,顺便说一下栈的概念。 栈是一个后进先出的压入(push)和弹出(pop)式数据结构。在程序运行时,系统每次向栈中压入一个对象,然后栈指针向下移动一个位置。当系统从栈中弹出一个对象时,最近进栈的对象将被弹出。然后栈指针向上移动一个位置。程序员经常利用栈这种数据结构来处理那些最适合用后进先出逻辑来描述的编程问题。这里讨论的程序中的栈在每个程序中都是存在的,它不需要程序员编写代码去维护,而是由运行是系统自动处理。所谓的系统自动维护,实际上就是编译器所产生的程序代码。尽管在源代码中看不到它们,但程序员应该对此有所了解。 再来看看程序中的栈是如何工作的。当一个函数(调用者)调用另一个函数(被调用者)时,运行时系统将把调用者的所有实参和返回地址压入到栈中,栈指针将移到合适的位置来容纳这些数据。最后进栈的是调用者的返回地址。当被调用者开始执行时,系统把被调用者的自变量压入到栈中,并把栈指针再向下移,以保证有足够的空间存储被调用者声明的所有自变量。当调用者把实参压入栈后,被调用者就在栈中以自变量的形式建立了形参。被调用者内部的其他自变量也是存放在栈中的。由于这些进栈操作,栈指针已经移动所有这些局部变量之下。但是被调用者记录了它刚开始执行时的初始栈指针,以他为参考,用正或负的偏移值来访问栈中的变量。当被调用者准备返回时,系统弹出栈中所有的自变量,这时栈指针移动了被调用者刚开始执行时的位置。接着被调用者返回,系统从栈中弹出返回地址,调用者就可以继续执行了。当调用者继续执行时,系统还将从栈中弹出调用者的实参,于是栈指针回到了调用发生前的位置。 可能刚开始学的人看不太懂上面的讲解,栈涉及到指针问题,具体可以看看一些数据结构的书。要想学好编程语言,数据结构是一定要学的。 二、递归 递归,是函数实现的一个很重要的环节,很多程序中都或多或少的使用了递归函数。递归的意思就是函数自己调用自己本身,或者在自己函数调用的下级

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语言实现二叉树的前序遍历(递归)

C语言实现二叉树的前序遍历算法实现一: #include #include typedef struct BiTNode//定义结构体 { char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; void CreateBiTree(BiTree &T) //前序创建树 { char ch; scanf("%c",&ch); if(ch==' ') T=NULL; else { T=(struct BiTNode *)malloc(sizeof(struct BiTNode)); T->data=ch; CreateBiTree(T->lchild); CreateBiTree(T->rchild); } } int print(BiTree T)//前序遍历(输出二叉树) { if(T==NULL)return 0; else if(T->lchild==NULL && T->rchild==NULL)return 1; else return print(T->lchild)+print(T->rchild); } void main()//主函数 { BiTree T; CreateBiTree(T); printf("%d\n",print(T)); } 算法实现二: #include

#include struct BiTNode//定义结构体 { char data; struct BiTNode *lchild,*rchild; }; int num=0; void CreatBiTree(struct BiTNode *&p) //前序创建树 { char ch; scanf("%c",&ch); if(ch==' ') p=NULL; else { p=(struct BiTNode *)malloc(sizeof(struct BiTNode)); p->data=ch; CreatBiTree(p->lchild); CreatBiTree(p->rchild); } } void print(struct BiTNode *p) //前序遍历(输出二叉树){ if(p!=NULL) { if(p->lchild==NULL&&p->rchild==NULL) else { print(p->lchild); print(p->rchild); } } } void main()//主函数 { struct BiTNode *p; CreatBiTree(p); print(p); printf("%d\n",num); } 供测试使用的数据

C语言函数习题及答案

函数习题 一、选择题 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)实参与其对应的形参共占存储单元

二叉树遍历C语言(递归,非递归)六种算法

数据结构(双语) ——项目文档报告用两种方式实现表达式自动计算 专业: 班级: 指导教师: 姓名: 学号:

目录 一、设计思想 (01) 二、算法流程图 (02) 三、源代码 (04) 四、运行结果 (11) 五、遇到的问题及解决 (11) 六、心得体会 (12)

一、设计思想 二叉树的遍历分为三种方式,分别是先序遍历,中序遍历和后序遍历。先序遍历实现的顺序是:根左右,中序遍历实现的是:左根右,后续遍历实现的是:左右根。根据不同的算法分,又分为递归遍历和非递归遍历。 递归算法: 1.先序遍历:先序遍历就是首先判断根结点是否为空,为空则停止遍历,不为空则将左子作为新的根结点重新进行上述判断,左子遍历结束后,再将右子作为根结点判断,直至结束。到达每一个结点时,打印该结点数据,即得先序遍历结果。 2.中序遍历:中序遍历是首先判断该结点是否为空,为空则结束,不为空则将左子作为根结点再进行判断,打印左子,然后打印二叉树的根结点,最后再将右子作为参数进行判断,打印右子,直至结束。 3.后续遍历:指针到达一个结点时,判断该结点是否为空,为空则停止遍历,不为空则将左子作为新的结点参数进行判断,打印左子。左子判断完成后,将右子作为结点参数传入判断,打印右子。左右子判断完成后打印根结点。 非递归算法: 1.先序遍历:首先建立一个栈,当指针到达根结点时,打印根结点,判断根结点是否有左子和右子。有左子和右子的话就打印左子同时将右子入栈,将左子作为新的根结点进行判断,方法同上。若当前结点没有左子,则直接将右子打印,同时将右子作为新的根结点判断。若当前结点没有右子,则打印左子,同时将左子作为新的根结点判断。若当前结点既没有左子也没有右子,则当前结点为叶子结点,此时将从栈中出栈一个元素,作为当前的根结点,打印结点元素,同时将当前结点同样按上述方法判断,依次进行。直至当前结点的左右子都为空,且栈为空时,遍历结束。 2.中序遍历:首先建立一个栈,定义一个常量flag(flag为0或者1),用flag记录结点的左子是否去过,没有去过为0,去过为1,默认为0.首先将指针指向根结点,将根结点入栈,然后将指针指向左子,左子作为新的结点,将新结点入栈,然后再将指针指向当前结点的左子,直至左子为空,则指针返回,flag置1,出栈一个元素,作为当前结点,打印该结点,然后判断flag,flag为1则将指针指向当前结点右子,将右子作为新的结点,结点入栈,再次进行上面的判断,直至当前结点右子也为空,则再出栈一个元素作为当前结点,一直到结束,使得当前结点右子为空,且栈空,遍历结束。 3.后续遍历:首先建立两个栈,然后定义两个常量。第一个为status,取值为0,1,2.0代表左右子都没有去过,1代表去过左子,2,代表左右子都去过,默认为0。第二个常量为flag,取值为0或者1,0代表进左栈,1代表进右栈。初始时指针指向根结点,判断根结点是否有左子,有左子则,将根结点入左栈,status置0,flag置0,若没有左子则判断结点有没有右子,有右子就把结点入右栈,status置0,flag置1,若左右子都没有,则打印该结点,并将指针指向空,此时判断flag,若flag为0,则从左栈出栈一个元素作为当前结点,重新判断;若flag为1则从右栈出栈一个元素作为当前结点,重新判断左右子是否去过,若status 为1,则判断该结点有没有右子,若有右子,则将该结点入右栈,status置1,flag置1,若没有右子,则打印当前结点,并将指针置空,然后再次判断flag。若当前结点status为2,且栈为空,则遍历结束。若指针指向了左子,则将左子作为当前结点,判断其左右子情况,按上述方法处理,直至遍历结束。

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();

函数的递归调用与分治策略

函数的递归调用与分治策 略 This manuscript was revised on November 28, 2020

函数的递归调用与分治策略 递归方法是算法和程序设计中的一种重要技术。递归方法即通过函数或过程调用自身将问题转化为本质相同但规模较小的子问题。递归方法具有易于描述和理解、证明简单等优点,在动态规划、贪心算法、回溯法等诸多算法中都有着极为广泛的应用,是许多复杂算法的基础。递归方法中所使用的“分而治之”的策略也称分治策略。 递归方法的构造 构造递归方法的关键在于建立递归关系。这里的递归关系可以是递归描述的,也可以是递推描述的。下面由一个求n的阶乘的程序为例,总结出构造递归方法的一般步骤。 [例1]从键盘输入正整数N(0<=N<=20),输出N!。 [分析]N!的计算是一个典型的递归问题。使用递归方法来描述程序,十分简单且易于理解。 [步骤1]描述递归关系递归关系是这样的一种关系。设{U1,U2,U3,…,Un…}是一个序列,如果从某一项k开始,Un和它之前的若干项之间存在一种只与n有关的关系,这便称为递归关系。 注意到,当N>=1时,N!=N*(N-1)!(N=1时,0!=1),这就是一种递归关系。对于特定的K!,它只与K与(K-1)!有关。 [步骤2]确定递归边界在步骤1的递归关系中,对大于k的Un的求解将最终归结为对Uk的求解。这里的Uk称为递归边界(或递归出口)。在本例中,递归边界为k=0,即0!=1。对于任意给定的N!,程序将最终求解到0!。 确定递归边界十分重要,如果没有确定递归边界,将导致程序无限递归而引起死

循环。例如以下程序: #include <> int f(int x){ return(f(x-1)); } main(){ cout<=1时 n!= 1 当N=0时 再将这种关系翻译为代码,即一个函数: long f(int n){ if (n==0) return(1); else return(n*f(n-1)); } [步骤4]完善程序主要的递归函数已经完成,将程序依题意补充完整即可。

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)实参将其值传递给形参,调用结束时形参再将其值回传给实参

实验7-2-函数调用

实验7-2 函数(二) 1 【实验目的】 (1)掌握函数的嵌套调用的方法 (2)掌握函数的递归调用的方法 (3)掌握全局变量和局部变量的概念和用法 【实验要求】 (1)熟练掌握函数的嵌套调用的方法 (2)熟练掌握函数的递归调用的方法 【实验环境】 (1) Microsoft XP操作系统 (2) Microsoft VC++ 6.0 【实验内容】 1、素数https://www.doczj.com/doc/fa9387072.html,/acmhome/problemdetail.do?&method=showdetail&id=1098描述:输出100->200之间的素数的个数,以及所有的素数。 输入:无 输出:100->200之间的素数的个数,以及所有的素数。 样例输入:无 样例输出:

21 101 103 ... 197 199 2、字符串逆序https://www.doczj.com/doc/fa9387072.html,/JudgeOnline/problem.php?id=1499 题目描述:写一函数,使输入的一个字符串按反序存放,在主函数中输入输出反序后的字符串。 输入:一行字符 输出:逆序后的字符串 样例输入:123456abcdef 样例输出:fedcba654321 3、字符串拼接https://www.doczj.com/doc/fa9387072.html,/JudgeOnline/problem.php?id=1500 题目描述:写一函数,将两个字符串连接 输入:两行字符串 输出:链接后的字符串 样例输入: 123 abc 样例输出 123abc 4、输出元音https://www.doczj.com/doc/fa9387072.html,/JudgeOnline/problem.php?id=1501

C语言函数习题

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.编写计算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通过运行时堆栈支持递归函数的实现。递归函数就是直接或间接调用自身的函数。 许多教科书都把计算机阶乘和菲波那契数列用来说明递归,非常不幸我们可爱的著名的老潭老师的《C语言程序设计》一书中就是从阶乘的计算开始的函数递归。导致读过这本经书的同学们,看到阶乘计算第一个想法就是递归。但是在阶乘的计算里,递归并没有提供任何优越之处。在菲波那契数列中,它的效率更是低的非常恐怖。 这里有一个简单的程序,可用于说明递归。程序的目的是把一个整数从二进制形式转换为可打印的字符形式。例如:给出一个值4267,我们需要依次产生字符‘4’,‘2’,‘6’,和‘7’。就如在printf函数中使用了%d格式码,它就会执行类似处理。 我们采用的策略是把这个值反复除以10,并打印各个余数。例如,4267除10的余数是7,但是我们不能直接打印这个余数。我们需要打印的是机器字符集中表示数字‘7’的值。在ASCII码中,字符‘7’的值是55,所以我们需要在余数上加上48来获得正确的字符,但是,使用字符常量而不是整型常量可以提高程序的可移植性。‘0’的ASCII码是48,所以我们用余数加上‘0’,所以有下面的关系: ‘0’+ 0 =‘0’ ‘0’+ 1 =‘1’ ‘0’+ 2 =‘2’ ... 从这些关系中,我们很容易看出在余数上加上‘0’就可以产生对应字符的代码。接着就打印出余数。下一步再取商的值,4267/10等于426。然后用这个值重复上述步骤。 这种处理方法存在的唯一问题是它产生的数字次序正好相反,它们是逆向打印的。所以在我们的程序中使用递归来修正这个问题。 我们这个程序中的函数是递归性质的,因为它包含了一个对自身的调用。乍一看,函数似乎永远不会终止。当函数调用时,它将调用自身,第2次调用还将调用自身,以此类推,似乎永远调用下去。这也是我们在刚接触递归时最想不明白的事情。但是,事实上并不会出现这种情况。 这个程序的递归实现了某种类型的螺旋状while循环。while循环在循环体每次执行时必须取得某种进展,逐步迫近循环终止条件。递归函数也是如此,它在每次递归调用后必须越来越接近某种限制条件。当递归函数符合这个限制条件时,它便不在调用自身。 在程序中,递归函数的限制条件就是变量quotient为零。在每次递归调用之前,我们都把quotient除以10,所以每递归调用一次,它的值就越来越接近零。当它最终变成零时,递归便告终止。 /*接受一个整型值(无符号0,把它转换为字符并打印它,前导零被删除*/

【习题】函数调用Word版

函数调用 【实验目的】: 1. 掌握函数的定义和调用方法。 2. 练习重载函数的使用。 3. 练习有默认参数值的函数的使用。 4. 练习使用系统函数。 5. 熟悉多文件工程结构。 【实验内容】: 1.编写函数int add(int x, int y),实现两个整型数据x,y的求和功能。 ·要求:使用Visual C++的Debug调试功能,记录在函数调用时实参和形参的值 的变化。 2.编写一个求x的n次方的程序int pow(int m, int n),计算m的n次方的结果。 3.利用上题中设计两个函数,设计一个求两个整数的平方和的程序。要求如下: a)主函数中调用求和函数: int add(int x, int y);

求和函数add中调用上题设计的int pow(int m, int n)函数来计算其平方。 4.多文件程序结构:一个文件可以包含多个函数定义,但是一个函数的定义必须完 整的存在于一个文件中。要求: a)将add函数的声明部分放在头文件(add.h)中,实现部分放在源文件(add.cpp) 中。 b)将pow函数的声明部分放在头文件(pow.h)中,实现部分放在源文件(pow.cpp) 中。 c)在main函数中调用add函数,计算从屏幕终端输入的两个数据之和。(main 函数的实现在main.cpp中) 5.将第2题设计的pow函数修改成为递归函数。

6.设计一个函数int fac(int n),利用函数的递归调用,来计算n!(n的阶乘)。 ·要求:单步调试程序,记录递归函数的调用过程。 7.使用系统函数pow(x,y)计算x y的值,注意包含头文件cmath。 8.从键盘输入两个数字,分别赋值给变量a、b,设计一个子函数swap,实现这两个数字交换次序。(注:根据需要自己设计函数的参数及返回值) ·要求:使用Visual C++的Debug调试功能,记录在函数调用时实参和形参的值的变化。 9.设计一个函数,求圆的面积。 要求:在主函数中调用子函数calArea计算圆的面积。并将calArea函数设计为内联函数。

C语言函数练习题及答案

C语言函数练习题及答 案 Company Document number:WTUT-WT88Y-W8BBGB-BWYTT-19998

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

【单选题】 C语言中函数返回值的类型是由以下哪个选项决定的 ?A、 函数定义时指定的类型; ?B、 return语句中的表达式类型; ?C、 调用该函数时的实参的数据类型; ?D、 形参的数据类型; 我的答案:A得分:分 4 【单选题】 以下关于函数叙述中,错误的是 ?A、 函数未被调用时,系统将不为形参分配内存单元; ?B、 实参与形参的个数必须相等,且实参与形参的类型必须对应一致; ?C、 当形参是变量时,实参可以是常量、变量或表达式; ?D、 如函数调用时,实参与形参都为变量,则这两个变量不可能共享同一内存空间; 我的答案:B得分:分 5 【单选题】 若函数调用时参数为基本数据类型的变量,以下叙述正确的是?A、

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

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、 数组第一个元素的地址; ?

第十一讲 函数的递归调用及函数中的变量定义

第十一讲函数的递归调用及函数中的变量定义 一、函数的递归调用 1.递归的概念 直接递归调用:调用函数的过程中又调用该函数本身,自己调用自己。 间接递归调用:调用f1函数的过程中调用f2函数,而f2中又需要调用f1。 以上均为无终止递归调用。为了让这种调用终止,一般要用if语句来控制使递归过程到某一条件满足时结束。 2、递归法 类似于数学证明中的反推法,从后一结果与前一结果的关系中寻找其规律性。 递归法:从结果出发,归纳出后一结果与前一结果直到初值为止存在的关系 编程思想:设计一个函数(递归函数),这个函数不断使用下一级值调用自身,直到结果已知处——选择控制结构 其一般形式是: 递归函数名f (参数n) { if (n=初值) 结果=常量; else 结果=含f(x-1)的表达式; return 结果; } 例1.输入一个n,编写函数求n!,根据不同的算法,我们可以用三种方式。 方式一:用递推算法,Sn=n!的递推关系如下: 1 (n=1,0) Sn= Sn-1×n n>1 是一种累计乘积的关系,先得到上一个数的阶乘,然后再得到得到下个数的阶乘,用循环结构来实现。 程序代码如下: main()

{ int n; float sn; float fac(int ); /*函数的声明*/ printf("Input n="); scanf("%d",&n); sn=fac(n); /*函数的调用*/ printf("%d!=%.0f",n,sn); } float fac(int n) /*函数的定义*/ { float f=1.0; int i; if (n==0||n==1) return f; for(i=1;i<=n;i++) f=f*i; return f; } 方式二:用递归算法,f(n)=n!的递归求解关系如下: 1 (n=1,0) f(n)= f(n-1)×n n>1 递归程序分两个阶段执行—— ①回推(调用):欲求n! →先求 (n-1)! →(n-2)! →…→ 1! 若1!已知,回推结束。 ②递推(回代):知道1!→2!可求出→3!→…→ n! 注意:在此可画图来说明 程序清单如下: main() { int n; float sn; float fac(); /*函数的声明*/ clrscr(); printf("Input n=");

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分

用递归法解决问题

3.5用递归法解决问题 【教材分析】 “用递归法解决问题”是《算法与程序设计》第三章第5节的内容,学业水平测试对本节内容也达到了B级要求,本节内容是在学习了VB基础知识中的三种基本结构,并且学习了数组、用解析法和穷举法解决问题等算法。本节先后介绍了“什么是递归法”、“自定义函数”、以及应用自定义函数结合递归算法来解决问题实例。通过本节内容的学习可以培养学生分析和分解问题的能力。从教材的结构上看“自定义函数”和“递归算法”是独立的,可以分别讲解,但在使用时两者是相辅相成的。 【学情分析】 这节课的教学对象是高中二年级学生,已经学习了算法与程序设计VB中的一些基础知识,初步了解了算法的概念。特点是在学习循环结构的过程中,学生已经积累了一些“递归”和“穷举”的算法。但是学生对函数尤其是“自定义函数”非常陌生,而“自定义函数”和“递归法”是本册的学习重点,也是以后编程的重点。学习本节内容学生可以充分体会递归算法的思想过程,扩大原来的知识面,进一步认识程序设计的功能,进一步激发学生学习算法与程序设计的兴趣。 【教学目标】 1.知识与技能: 理解什么是递归法,会用递归法的思想分析和解决问题 理解什么是自定义函数,能应用自定义函数实现递归算法的编程 2.过程与方法 学生通过思考、探究,体验递归算法和发现问题与解决问题的步骤 3.情感态度与价值观 在建立数学模型中培养学生的抽象思维能力,培养学生多维度思考问题和解决能力。 树立多学科整合的思想意识,能够用联系的观点解决问题。 【教学重点】 理解什么是递归算法,学会用递归法的思想分析问题。 理解自定义函数的概念。 【教学难点】 用自定义函数和递归算法编写程序解决问题 【教学方法及策略】

C语言递归练习(附答案)

dic递归基础练习题: 1.求1+2+3+……+n的值 int sum(int a,int b) { if(b==a) return a; return a+sum(a+1,b); } 2. 求1*2*3*……*n的值 cheng(int begin,int end) { if(begin==end) return begin; return begin * cheng(begin+1,end); } 3. 数的全排列问题。将n个数字1,2,…n的所有排列按字典顺序枚举出猴 2 3 1 2 1 3 3 1 2 3 2 1 4. 数的组合问题。从1,2,…,n中取出m个数,将所有组合按照字典顺序列出。 如n=3,m=2时,输出: 1 2 1 3 2 3 5. 小猴子第一天摘下若干桃子,当即吃掉一半,又多吃一个.第二天早上又将剩下的桃子吃一半,又多吃一个.以后每天早上吃前一天剩下的一半另一个.到第10天早上猴子想再吃时发现,只剩下一个桃子了.问第一天猴子共摘多少个桃子? fruit(int begin,int times) { if(times==10) return begin; return fruit((begin+1)*2,times+1); } 6. 有雌雄一对兔子,假定过两个月便可繁殖雌雄各一的一对小兔子。问过n个月后共有多少对兔子? 7. 一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子? duck(int begin,int times) { if(times==7) return begin; return duck((begin+1)*2,times+1); }

c语言实验报告9 函数的嵌套调用和递归调用、数组作为函数参数

《C程序设计》课程实验报告 学院:班级:姓名:学号: 实验设备:计算机1台实验日期:2011年3月1日 实验项目名称函数的嵌套调用和递归调用、数组作为函数参数 实验目的 掌握函数的嵌套调用和递归调用。数组名作为函数参数的设计方 法。 实验要求: 掌握函数的嵌套调用和递归调用。数组名作为函数参数的设计方法。 编写简单程序。 实验内容(包括步骤): 1.编写程序,计算下列函数值: f(x,y)= 其中,s(n)= =p(1)+p(2)+…p(n),p(i)=i!。 要求:(1)为函数p(i)、s(n)、f(x,y)均编写一个用户函数。 (2)x、y由键盘输入。

2.n个人按年龄从小到大站成一排,编号依次为1到n,年龄都相差2岁,且第一个人的年龄是10岁,问第n个的年龄是多大? 要求:1)通过函数递归调用方式。2)n的值从键盘输入。 3.有两个数组a、b,各有10个元素,分别统计出两个数组对应元素大于(a[i]>b[i])、等于(a[i]=b[i])和小于(a[i] int main() { float f(int x,int y); int a,b; float m; scanf("%d%d",&a,&b); m=f(a,b); printf("%f\n",m);

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