当前位置:文档之家› 函数的调用过程(c++)

函数的调用过程(c++)

函数的调用过程(c++)
函数的调用过程(c++)

函数的调用过程

#include

int max(float,float); //(1)

void main()

{ float a,b;

int c;

cout<<"输入两个实数";

cin>>a>>b;

c=max(a,b); //(2) (3)

cout<<"两个数中的大数为:"<

}

int max(float x,float y) //(4) (5)

{

float z;

z=x>y?x:y;

return z; //(6)

(1) 先调用后定义,应进行函数原型说明。

(2) 通过max(a,b)语句来调用max函数,并且把a的值赋给x、b的值赋给y;

(3) 函数的实参,它必须是确定的值。写成如下的形式是错误的:int a,int b或int a,b

(4) 函数的返回值类型,它可以是:int、float、double、char、void、结构体类型、类类型

(5) 函数的形参,它必须是每个形式都要进行类型说明,写成int x,y是错误的。

(6) 函数的值z给main函数中的max(a,b)调用语句。题中z的值的类型为float,但给max(a,b)调用语句的值确为int。

二维数组的应用有以下几种情况

1、求二维数组元素中的最大值和最小值,以及其所在的行号和列号#include

#include

void main()

{

int a[4][4];

int i,j;

int max,min,rmax,rmin,cmax,cmin;

//给二维数组赋值

for( i=0;i<4;i++)

for( j=0;j<4;j++)

cin>>a[i][j];

//输出二维数组

for(i=0;i<4;i++)

{

for(j=0;j<4;j++)

cout<

cout<

}

cout<

//求二维数组中最大数、最小数及其行号和列号

max=min=a[0][0];

rmax=rmin=cmax=cmin=0;

for(i=0;i<4;i++)

for(j=0;j<4;j++)

{

if(a[i][j]>max)max=a[i][j],rmax=i,cmax=j;

if(a[i][j]

}

cout<<"max="<

cout<<"最大值所在行列号:("<

cout<<"min="<

cout<<"最小值所在行列号:("<

cout<

}

2、求每行(列)的平均值、最大(小)值

#include

#include

void main()

{

int a[5][5],i,j,s1=0,s2=0,sun=0,k=1;

int rmax,rmin,rsum=0;

double c[5][5],cmax,cmin,csum=0;

//给二维数组赋值

for( i=0;i<4;i++)

for( j=0;j<4;j++)

a[i][j]=k++;

//输出二维数组

for(i=0;i<4;i++)

{

for(j=0;j<4;j++)

cout<

cout<

}

cout<

//求每行的最大数、最小数及每行元素的平均值

for(i=0;i<4;i++)

{

rmax=rmin=a[i][0];

rsum=0;

for(j=0;j<4;j++)

{

rsum+=a[i][j];

if(a[i][j]>rmax)rmax=a[i][j];

if(a[i][j]

cout<

}

cout<

cout<

//求每列的最大数、最小数及每行元素的平均值

for(i=0;i<4;i++)

{

cmax=cmin=a[0][i];

csum=0;

for(j=0;j<4;j++)

{

csum+=a[j][i];

if(a[j][i]>cmax)cmax=a[j][i];

if(a[j][i]

}

c[0][i]=cmax;

c[1][i]=cmin;

c[2][i]=csum/4.0;

}

for(i=0;i<3;i++){

for(j=0;j<4;j++)

cout<

cout<<'\n';

}

}

3、二维数组中行和列元素互换(转置)#include

void main()

{

int a[5][5],k=1,i,j;

//二维数组初始化

for(i=0;i<5;i++)

for(j=0;j<5;j++)

a[i][j]=k++;

//二维数组按行列形式输出

for(i=0;i<5;i++)

{

for(j=0;j<5;j++)

cout<

cout<<'\n';

}

cout<

//二维数组转置

for(i=0;i<5;i++)

for(j=0;j<=i;j++)

{

k=a[i][j];

a[i][j]=a[j][i];

a[j][i]=k;

}

//二维数组按行列形式输出

for(i=0;i<5;i++)

{

for(j=0;j<5;j++)

cout<

cout<<'\n';

}

}

4、计算二维数组全部外侧元素和及全部非外侧元素之和以及二对角线元素之和#include

#include

void main()

{

int a[4][4],i,j,s1=0,s2=0,sun=0,k=1;

//给二维数组赋值

for( i=0;i<4;i++)

for( j=0;j<4;j++)

a[i][j]=k++;

//输出二维数组

for(i=0;i<4;i++)

{

for(j=0;j<4;j++)

cout<

cout<

}

//求外侧元素之和及非外侧元素之和及两对角线元素之和

for(i=0;i<4;i++)

for(j=0;j<4;j++){

if(i==0||i==3||j==0||j==3)

s1+=a[i][j];

else

s2+=a[i][j];

if(i==j)

sun+=a[i][j]+a[3-i][j];

}

sun=sun;

cout<<"外围元素之和s1="<

cout<<"非外侧元素之和s2="<

cout<<"两对角线元素之和sun="<

5、将方阵顺时针或逆时针旋转900

#include

void main()

{

int a[5][5],b[5][5],k=1,i,j;

//二维数组初始化

for(i=0;i<5;i++)

for(j=0;j<5;j++)

a[i][j]=k++;

//二维数组按行列形式输出

for(i=0;i<5;i++)

{

for(j=0;j<5;j++)

cout<

cout<<'\n';

}

cout<

//二维数组顺时针旋转

/*for(i=0;i<5;i++)

for(j=0;j<5;j++)

b[j][4-i]=a[i][j];*/

//二维数组逆时针旋转

for(i=0;i<5;i++)

for(j=0;j<5;j++)

b[4-j][i]=a[i][j];

//二维数组按行列形式输出

for(i=0;i<5;i++)

{

for(j=0;j<5;j++)

cout<

cout<<'\n';

}

}

6、生成一个按蛇形方式排列自然数1,2,3,……,N2的N阶方阵#include

#define n 5

void main()

{

int a[n][n],num=1,i,j;

//生成蛇形方阵

for(i=0;i<=((n-1)/2);i++)

{

for(j=i;j<=(n-i-1);j++) //上行

a[i][j]=num++;

for(j=i+1;j<=(n-i-1);j++) //右列

for(j=n-i-2;j>=(i+1);j--) //下行a[n-i-1][j]=num++;

for(j=n-i-1;j>=(i+1);j--) //左列a[j][i]=num++;

}

//二维数组按行列形式输出

for(i=0;i

{

for(j=0;j

cout<

cout<<'\n';

}

cout<

}

7、求N阶方阵中的鞍点

#include

void main()

{

int a[5][5],k=1,i,j;

//二维数组初始化

for(i=0;i<5;i++)

for(j=0;j<5;j++)

a[i][j]=k++;

//二维数组按行列形式输出

for(i=0;i<5;i++)

{

for(j=0;j<5;j++)

cout<<'\n';

}

cout<

//二维数组的鞍点

int max,maxi,flag=0;

for(i=0;i<5;i++)

{

max=a[i][0],maxi=0;

for(j=0;j<5;j++)

if(a[i][j]>max){max=a[i][j];maxi=j;}

for(j=0;j<5;j++)

if(max>a[j][maxi])break;

if(j>=5)

{

cout<<"a["<

flag=1;

}

if(!flag)

cout<<"No!\n";

}

}

8、生成折叠式矩阵

#include

void main()

{

int a[4][4],startnum;

cout<<"请输入起始数据startnum:\n"<<"startnum=\t";

cin>>startnum;

//生成折叠式矩阵

for(int i=0;i<4;i++)

{

for(int j=0;j<=i;j++)

a[j][i]=startnum++;

for(j-=2;j>=0;j--)

a[i][j]=startnum++;

}

cout<

for(i=0;i<4;i++)

{

for(int j=0;j<4;j++)

cout<

cout<<'\n';

}

cout<

}

一维数组的应用有以下几种情况

1、求一维数组中的最大值、最小值以及最大值、最小值所在的位置和平均值。

#include

void main(void)

{ int a[5]={ 3, 5, 7, 9, 8},ii=0,jj=0;

int s1=a[0], s2=a[0];

float s3=0;

for (int i=0; i<5; i++)

{ s3+=a[i];

if (a[i]>s1) {s1=a[i];ii=i;}

if (a[i]

}

s3/=5;

cout<<"最大值、最小值、平均值分别为:"<

cout<<"最大值所在的位置:"<

2、选择法排序

#include

#include

void bubble(int [],int);

void isort(int [],int);

void main()

{

int b[]={73,6,37,4,32,12,9,55,26,2};

int len=sizeof(b)/sizeof(int);

for(int i=0;i

cout<

cout<

int temp;

for( i=0;i

{

for(int j=i+1;j

if(b[i]>b[j]){

temp=b[i];

b[i]=b[j];

b[j]=temp;

}

for(j=0;j

cout<

cout<

}

}

3、起泡法排序

#include

#include

void main()

{

int b[]={73,6,37,4,32,12,9,55,26,2};

int len=sizeof(b)/sizeof(int);

for(int i=0;i

cout<

cout<

int temp;

for(int j=1;j

{

for(i=0;i

if(b[i]>b[i+1]){

temp=b[i];

b[i]=b[i+1];

b[i+1]=temp;

}

for(i=0;i

cout<

}

}

4、插入法排序

#include

#include

void main()

{

int d[]={73,6,37,4,32,12,9,55,26,2};

int len=sizeof(d)/sizeof(int);

for(int i=0;i

cout<

cout<

int inserter,index;

for( i=1;i

{

inserter=d[i];

index=i-1;

while(index>=0&&inserter

d[index+1]=d[index]; //后挪一个位置

index--;

}

d[index+1]=inserter; //插入

for(int j=0;j

{

cout<

if(j==i) //已排序与末排序的分界线

cout<<'|';

}

cout<

}

}

5、数据逆序存放

#include

#include

void main()

{

int a[]={73,6,37,4,32,12,9,55,26,2};

int len=sizeof(a)/sizeof(int);

cout<<"原数组为:\n";

for(int i=0;i

cout<

cout<

int temp,j;

for(i=0,j=len-1;i

{ temp=a[i];

a[i]=a[j];

a[j]=temp;

}

cout<<"逆序后的数组为:\n";

for(i=0;i

cout<

cout<

}

6、在有序数中插入一个数使其仍有序、删除一个数#include

void main()

{

int a[10]={7,12,17,20,25,28},x,i,n=5;

cout<<"input a number:";

cin>>x;

i=n;

while(a[i]>x) //查找插入点

a[i+1]=a[i];

i--;

}

a[++i]=x;

for(i=0;i<=n+1;i++)

cout<

cout<

}

7、查找一个数在数组中的位置

#include

void main()

{

int a[10]={2,4,6,8,10,12,14,16,18,20},k;

int low=0,hig=9,mid,flage=0;

cout<<"请输入要查找的数k:\tk=";

cin>>k;

while(low<=hig)

{

mid=(low+hig)/2;

if(a[mid]==k)

{

flage=1;

break;

}

else if(a[mid]>k)

hig=mid-1;

else

low=mid+1;

if(flage)

cout<

else

cout<<"数组a中没有"<

}

8、二个有序数组合并后仍要有序并要删除相同数据元素等。#include

void main()

{

int a[10]={3,6,8,11,13,20,24};

int b[20]={2,4,6,8,20};

int s[20];

int m=6,n=4,i=0,j=0,k=0;

while(i<=m&&j<=n)

{

if(a[i]

else if(a[i]==b[j]){s[k++]=a[i];i++;j++;}

else {s[k++]=b[j];j++;}

}

if(i>m)for(;j<=n;j++)s[k++]=b[j];

else for(;i<=m;i++) s[k++]=a[i];

for(int l=0;l

cout<

cout<

}

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

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

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

函数的递归调用与分治策 略 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]完善程序主要的递归函数已经完成,将程序依题意补充完整即可。

调用类的方法

语法如下: 语法 [访问修饰符] 返回值的类型方法名([参数列表]){ //方法体 }

(1)访问修饰符 已经讲述过类的访问修饰符,其实同理,这里的方法的访问修饰符功能也是一样,public 表示公共的,private 表示私有的。 在程序中,如果将变量或者方法声明为public,就表示其他类可以访问,如果声明为private,

(2)方法的返回类型。 方法是供别人调用的,调用后可以返回一个值,这个返回值的数据类型就是方法的返回类型,可以是int、float、double、bool、string 等。如果方法不返回任何值,就使用void。

语法 return 表达式; 如果方法没有返回值,则返回类型应该使用void(空虚;空的),用于说明无返回值。 如:public void Singing() //无返回值 { Console.Write(“在唱歌。。。”); } return 语句做两件事情:表示已经完成,现在要离开这个方法;如果方法产生一个值,这个值放置在return 后面,即<表达式>部分。意思就是“离开该方法,并且将<表达式>的值返回给调用其的程序”。

注意:在编写程序的时候,一定要注意方法声明中返回值的类型和方法体中真正的返 回的值的类型是否匹配,如果不匹配,后果很严重。比如在下面这个ToString()方法中,返 回类型是String 类型,因此在方法体中必须用return 返回一个字符串,否则编译器将报错。

(3)方法名 定义一个方法都要有一个名称 注意:方法名主要用于调用这个方法时用,命名方法就像命名变量、类一样,要遵守一定的规则,如必须以字母、下划线“_”或“$”开头,绝对不能以数字开头。

实验7-2-函数调用

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

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

C++中函数调用时的三种参数传递方式

在C++中,参数传递的方式是“实虚结合”。 ?按值传递(pass by value) ?地址传递(pass by pointer) ?引用传递(pass by reference) 按值传递的过程为:首先计算出实参表达式的值,接着给对应的形参变量分配一个存储空间,该空间的大小等于该形参类型的,然后把以求出的实参表达式的值一一存入到形参变量分配的存储空间中,成为形参变量的初值,供被调用函数执行时使用。这种传递是把实参表达式的值传送给对应的形参变量,故称这种传递方式为“按值传递”。 使用这种方式,调用函数本省不对实参进行操作,也就是说,即使形参的值在函数中发生了变化,实参的值也完全不会受到影响,仍为调用前的值。 [cpp]view plaincopy 1./* 2. pass By value 3.*/ 4.#include https://www.doczj.com/doc/f58497748.html,ing namespace std; 6.void swap(int,int); 7.int main() 8.{ 9.int a = 3, b = 4; 10. cout << "a = " << a << ", b = " 11. << b << endl; 12. swap(a,b); 13. cout << "a = " << a << ", b = " 14. << b << endl; 15.return 0; 16.} 17.void swap(int x, int y) 18.{ 19.int t = x; 20. x = y; 21. y = t; 22.}

如果在函数定义时将形参说明成指针,对这样的函数进行调用时就需要指定地址值形式的实参。这时的参数传递方式就是地址传递方式。 地址传递与按值传递的不同在于,它把实参的存储地址传送给对应的形参,从而使得形参指针和实参指针指向同一个地址。因此,被调用函数中对形参指针所指向的地址中内容的任何改变都会影响到实参。 [cpp]view plaincopy 1.#include https://www.doczj.com/doc/f58497748.html,ing namespace std; 3.void swap(int*,int*); 4.int main() 5.{ 6.int a = 3, b = 4; 7. cout << "a = " << a << ", b = " 8. << b << endl; 9. swap(&a,&b); 10. cout << "a = " << a << ", b = " 11. << b << endl; 12. system("pause"); 13.return 0; 14.} 15.void swap(int *x,int *y) 16.{ 17.int t = *x; 18. *x = *y; 19. *y = t; 20.} 按值传递方式容易理解,但形参值的改变不能对实参产生影响。 地址传递方式虽然可以使得形参的改变对相应的实参有效,但如果在函数中反复利用指针进行间接访问,会使程序容易产生错误且难以阅读。

函数的定义和调用

函数的定义和调用 7.2函数定义 函数定义的一般形式: 类型标识符函数名(形式参数表列) 函数定义函数首部不要以分号结尾 { 说明部分 执行部分 } 例: int max(int a,int b)/*函数首部*/ ○1类型标识符○2函数名○3形式参数表列 { /*函数体开始*/○4 int z;/*说明部分*/ if(a>b)z=a; /*执行部分*/ else z=b; return(z); } 说明:函数定义包括函数首部和函数体两部分。 ○1类型标识将是指函数返回值的类型,简称函数值类型。函数的返回值由函数中的return 语句获得,即return后的表达式的值,可以是简单类型、void类型或构造类型等,注意一般函数返回什么类型的数据,函数的类型就定义成相应的类型。void类型为空类型,表示函数没有返回值。如希望不返回值,可以定义函数类型为void类型,当函数值类型为int时,可省略函数类型的说明。关于return:函数的值只能通过return语句返回主调函数,返回函数值的类型和函数定义中函数的类型应保持一致,如果函数值为int型可以省略函数类型说明,不返回函数值的函数,明确定义成空类型。 ○2函数名是函数的标识符。函数名取名遵循c语言标识符的命名规则,区分大小写。函数名后的形式参数表列给出函数的形式参数及其类型说明。 ○3形式参数简称形参,形式参数及其类型说明放在函数名后的一对圆括号中.无论函数是否有形式参数,函数名后的圆括号不可省;圆括号内没有形式参数的函数我们称之为无参函数,有形式参数的函数我们称为有参函数。强调:没有形式参数圆括号也不能省。形式参数可以是各种类型的变量,形式为:形参1类型形参1,形参2类型形参2 各参数之间用逗号间隔。在进行函数调用时,主调函数将赋予这些形式参数实际的值。 ○4函数体:函数说明之后的花括号“{}”括起来的部分,包括声明部分和执行部分: 1)声明部分:用来对函数中使用的变量和函数作说明。 2)执行部分由基本语句组成.函数的功能由函数体内的各个语句的执行来实现。 解释函数 函数的调用 一个函数被定义后,程序中的其他函数就可以使用这个函数,这个过程称为函数调用。 1。函数调用的一般形式 函数名(实参表列);实际参数表中的参数可以是常数、变量或构造类型数据,各实参之间也是用逗号分隔。对无参函数调用时无实际参数表。 函数有以下三种调用方式: (1) 函数表达式:函数调用出现在一个表达式中、这种表达式称为函数表达式。例如w =max(x,y);此时要求函数返回一个确定的值.参加表达式的计算。这里把max的返回值

递归算法详解

递归算法详解 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函数设计为内联函数。

MATLAB函数的调用形式

MATLAB中函数的调用形式MATLAB软件是一种可用于科技开发的高效率工具软件,它将科学计算、函数绘图与快速编程集于一体,不仅功能强大,而且易学易用,深受广大科技工作者和理工科大学生的喜爱。正在逐渐成为理工科大学生必须掌握的基本工具。 1.求函数导数的命令,调用格式是: (1)y=diff(‘f(x)’) (2)diff(‘f(x)’) (3)y=’ f(x)’ ;diff(y,’x’) (4)syms 各种变量; y=f(x);diff(y,x) 一般调用格式是: diff(y,x,n) 2.定义符号变量,一般形式: syms x y a b t 注解: syms是定义符号变量的命令, 被定义的多个变量之间用空格隔开。 3.转变一个符号表达式S的显示形式: pretty(S) 注解:pretty(S)的作用是将符号表达式S显示成更符合数学习惯的形式。 4.输入格式: fplot (‘f(x)’,[X的左界,X的右界,Y的左界,Y 的右界] 注意:●在书写运算语句时,屏幕的同一行可以同时有多个语句, 但语句之间必须用逗号或分号隔开; ●命令语句以分号结尾时,屏幕不显示运行结果; ●命令语句以逗号或不用标点结尾时,屏幕将显示运行结果。

a=100/12 %显示格式为默认的短型实数格式 format rat %显示格式转换为有理格式a format long %显示格式转换为长型实数格式 a format %还原为默认的短型实数格

5.使用clear命令可以删除所有定义过的变量, 如果只是要删除其中的某几个变量,则应在clear后面指明要删除的变量名称。 6.使用clc 命令可以清除屏幕上所有显示的内容, 但不会删除内存中的变量 7.MATLAB提供了大量的函数,可以满足各种运算需要。(1)使用命令help elfun 可列出所有的初等数学函数名。(2)使用命令help elmat可列出大量的矩阵函数名。

五种排序的算法(包括主函数调用)

#include #define MAX 100 void Quicksort(int d[],int min,int max); void Shellsort(int r[],int n); void Bubblesort(int r[],int n); void StraInsSort(int R[],int n); void Selectsort(int r[],int n); //*************************主函数********************** void main() { int s,ch,n,x,i; int a[MAX]; int p; printf("请输入待排序列中数据的个数:"); scanf("%d",&n); printf("请输入排序前序列:"); for(s=1;s<=n;s++) scanf("%d",&a[s]); { printf("0 is exit,other is continue:"); scanf("%d",&x); while(x) { for(p=1;p<=5;p++) { for(i=1;i<20;i++) printf("%c ",p);printf("\n"); printf("please input your choice(1-5):"); printf("\n1.直接插入排序\t2.希尔排序\t3.冒泡排序\n4.快速排序\t5.直接选择排序\t6.堆排序\n"); for(i=1;i<20;i++) printf("%c ",p); printf("\n"); printf("请选择:"); scanf("%d",&ch); switch(ch) { case 1: printf("\n直接插入排序\n"); StraInsSort(a,n); break;

C语言函数调用规定

在C语言中,假设我们有这样的一个函数: int function(int a,int b) 调用时只要用result = function(1,2)这样的方式就可以使用这个函数。但是,当高级语言被编译成计算机可以识别的机器码时,有一个问题就凸现出来:在CPU中,计算机没有办法知道一个函数调用需要多少个、什么样的参数,也没有硬件可以保存这些参数。也就是说,计算机不知道怎么给这个函数传递参数,传递参数的工作必须由函数调用者和函数本身来协调。为此,计算机提供了一种被称为栈的数据结构来支持参数传递。 栈是一种先进后出的数据结构,栈有一个存储区、一个栈顶指针。栈顶指针指向堆栈中第一个可用的数据项(被称为栈顶)。用户可以在栈顶上方向栈中加入数据,这个操作被称为压栈(Push),压栈以后,栈顶自动变成新加入数据项的位置,栈顶指针也随之修改。用户也可以从堆栈中取走栈顶,称为弹出栈(pop),弹出栈后,栈顶下的一个元素变成栈顶,栈顶指针随之修改。 函数调用时,调用者依次把参数压栈,然后调用函数,函数被调用以后,在堆栈中取得数据,并进行计算。函数计算结束以后,或者调用者、或者函数本身修改堆栈,使堆栈恢复原装。 在参数传递中,有两个很重要的问题必须得到明确说明: 当参数个数多于一个时,按照什么顺序把参数压入堆栈 函数调用后,由谁来把堆栈恢复原装 在高级语言中,通过函数调用约定来说明这两个问题。常见的调用约定有:stdcall cdecl fastcall thiscall naked call stdcall调用约定 stdcall很多时候被称为pascal调用约定,因为pascal是早期很常见的一种教学用计算机程序设计语言,其语法严谨,使用的函数调用约定就是stdcall.在Microsoft C++系列的C/C++编译器中,常常用PASCAL宏来声明这个调用约定,类似的宏还有WINAPI和CALLBACK. stdcall调用约定声明的语法为(以前文的那个函数为例): int __stdcall function(int a,int b) stdcall的调用约定意味着:1)参数从右向左压入堆栈,2)函数自身修改堆栈3)函数名自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸 以上述这个函数为例,参数b首先被压栈,然后是参数a,函数调用function(1,2)调用处翻译成汇编语言将变成: push 2 第二个参数入栈 push 1 第一个参数入栈 call function 调用参数,注意此时自动把cs:eip入栈 而对于函数自身,则可以翻译为: push ebp 保存ebp寄存器,该寄存器将用来保存堆栈的栈顶指针,可以在函数退出时恢复 mov ebp,esp 保存堆栈指针

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

第十一讲函数的递归调用及函数中的变量定义 一、函数的递归调用 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=");

函数调用参数传递类型(java)的用法介绍.

函数调用参数传递类型(java)的用法介绍. java方法中传值和传引用的问题是个基本问题,但是也有很多人一时弄不清。 (一)基本数据类型:传值,方法不会改变实参的值。 public class TestFun { public static void testInt(int i){ i=5; } public static void main(String[] args) { int a=0 ; TestFun.testInt(a); System.out.println("a="+a); } } 程序执行结果:a=0 。 (二)对象类型参数:传引用,方法体内改变形参引用,不会改变实参的引用,但有可能改变实参对象的属性值。 举两个例子: (1)方法体内改变形参引用,但不会改变实参引用,实参值不变。 public class TestFun2 { public static void testStr(String str){ str="hello";//型参指向字符串“hello” } public static void main(String[] args) { String s="1" ;

TestFun2.testStr(s); System.out.println("s="+s); //实参s引用没变,值也不变 } } 执行结果打印:s=1 (2)方法体内,通过引用改变了实际参数对象的内容,注意是“内容”,引用还是不变的。 import java.util.HashMap; import java.util.Map; public class TestFun3 { public static void testMap(Map map){ map.put("key2","value2");//通过引用,改变了实参的内容 } public static void main(String[] args) { Map map = new HashMap(); map.put("key1", "value1"); new TestFun3().testMap(map); System.out.println("map size:"+map.size()); //map内容变化了 } } 执行结果,打印:map size:2 。可见在方法testMap()内改变了实参的内容。 (3)第二个例子是拿map举例的,还有经常涉及的是 StringBuffer : public class TestFun4 {

用递归法解决问题

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

java script中的四种函数调用

《Javascript语言精粹》时,发现一些自己不知道或者没有一下子理解的东西,拿出来细细研究并记录一下。 函数被作为很重要的一部分在书中做了详细的介绍和举例。感觉函数的四种调用方式和在不同调用方式上’this’绑定的不同是个重点也是难点。欢迎大家一起研究。 方法调用模式: 调用形式:通过’.'点表达式或[subscript]下标表达式调用一个对象中的方法。this 绑定:this被绑定到被调用方法所属的对象上。例子: 帮助 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 // 创建 myObject 对象。它有一个 value 属性和一个 increment 方法。 // increment 方法接收一个可选参数。如果参数不是数字,那么默认使用数字1。 var g = 'global'; var myObject = { value: 0, increment: function (inc) { document.writeln(this.g); this.value += typeof inc === 'number' ? inc : 1; // 在方法被调用时this被绑定为myObject对象。 } }; document.writeln(this.g); // global // 打印出全局变量g的值,说明this被绑定在全局对象上。 myObject.increment(); // 在这里increment方法才被调用,this才被绑定到myObject对象, 这是特有“超级”迟绑定(very late binding)。 // 这时打印出的this.g为undefined,因为myObject中没有g这个属性, 可以看出这时this被绑定到了myObject对象上。 document.writeln(myObject.value); // 1

C语言函数调用三种方式 传值调用,引用调用和传地址调

C语言函数调用三种方式传值调用,引用调用和传地址调 我想,你只要看了C语言上关于传值函数调用的测试题,一切都会了然于胸:1. 考题一:程序代码如下: void Exchg1(int x, int y) { int tmp; tmp=x; x=y; y=tmp; printf(“x=%d,y=%d\n”,x,y) } void main() { int a=4,b=6; Exchg1 (a,b) ; printf(“a=%d,b=%d\n”,a,b) } 输出的结果: x=____, y=____ a=____, b=____ 问下划线的部分应是什么,请完成。 2. 考题二:代码如下。 Exchg2(int *px, int *py) { int tmp=*px; *px=*py; *py=tmp; print(“*px=%d,*py=%d\n”,*px,*py); } main()

{ int a=4; int b=6; Exchg2(&a,&b); Print(“a=%d,b=%d\n”, a, b); } 输出的结果为: *px=____, *py=____ a=____, b=____ 问下划线的部分应是什么,请完成。 3. 考题三: Exchg2(int &x, int &y) { int tmp=x; x=y; y=tmp; print(“x=%d,y=%d\n”,x,y); } main() { int a=4; int b=6; Exchg2(a,b); Print(“a=%d,b=%d\n”, a, b); } 二.函数参数传递方式之一:值传递 1.值传递的一个错误认识 先看题一中Exchg1函数的定义: void Exchg1(int x, int y) //定义中的x,y变量被称为Exchg1函数的形式参数{

C语言函数调用规定[试题]

C语言函数调用规定[试题] 在C语言中~假设我们有这样的一个函数: int function,int a~int b, 调用时只要用result = function,1~2,这样的方式就可以使用这个函数。但是~当高级语言被编译成计算机可以识别的机器码时~有一个问题就凸现出来:在CPU中~计算机没有办法知道一个函数调用需要多少个、什么样的参数~也没有硬件可以保存这些参数。也就是说~计算机不知道怎么给这个函数传递参数~传递参数的工作必须由函数调用者和函数本身来协调。为此~计算机提供了一种被称为栈的数据结构来支持参数传递。 栈是一种先进后出的数据结构~栈有一个存储区、一个栈顶指针。栈顶指针指向堆栈中第一个可用的数据项,被称为栈顶,。用户可以在栈顶上方向栈中加入数据~这个操作被称为压栈,Push,~压栈以后~栈顶自动变成新加入数据项的位置~栈顶指针也随之修改。用户也可以从堆栈中取走栈顶~称为弹出栈,pop,~弹出栈后~栈顶下的一个元素变成栈顶~栈顶指针随之修改。 函数调用时~调用者依次把参数压栈~然后调用函数~函数被调用以后~在堆栈中取得数据~并进行计算。函数计算结束以后~或者调用者、或者函数本身修改堆栈~使堆栈恢复原装。 在参数传递中~有两个很重要的问题必须得到明确说明: 当参数个数多于一个时~按照什么顺序把参数压入堆栈 函数调用后~由谁来把堆栈恢复原装 在高级语言中~通过函数调用约定来说明这两个问题。常见的调用约定有: stdcall cdecl

fastcall thiscall naked call stdcall调用约定 stdcall很多时候被称为pascal调用约定~因为pascal是早期很常见的一种 教学用计算机程序设计语言~其语法严谨~使用的函数调用约定就是stdcall.在Microsoft C++系列的C/C++编译器中~常常用PASCAL宏来声明这个调用约定~类似的宏还有WINAPI和CALLBACK. stdcall调用约定声明的语法为,以前文的那个函数为例,: int __stdcall function,int a~int b, stdcall的调用约定意味着:1,参数从右向左压入堆栈~2,函数自身修改堆栈 3,函数名自动加前导的下划线~后面紧跟一个@符号~其后紧跟着参数的尺寸以上述这个函数为例~参数b首先被压栈~然后是参数a~函数调用 function,1~2,调用处翻译成汇编语言将变成: push 2 第二个参数入栈 push 1 第一个参数入栈 call function 调用参数~注意此时自动把cs:eip入栈 而对于函数自身~则可以翻译为: push ebp 保存ebp寄存器~该寄存器将用来保存堆栈的栈顶指针~可以在函 数退出时恢复 mov ebp~esp 保存堆栈指针 mov eax~[ebp + 8H] 堆栈中ebp指向位置之前依次保存有ebp~cs:eip~a~b~ebp +8指向a add eax~[ebp + 0CH] 堆栈中ebp + 12处保存了b

C语言递归

递归,作为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语言程序设计 递归调用的概念

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

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

函数的递归调用与分治策略 递归方法是算法和程序设计中的一种重要技术。递归方法即通过函数或过程调用自身将问题转化为本质相同但规模较小的子问题。递归方法具有易于描述和理解、证明简单等优点,在动态规划、贪心算法、回溯法等诸多算法中都有着极为广泛的应用,是许多复杂算法的基础。递归方法中所使用的“分而治之”的策略也称分治策略。 递归方法的构造 构造递归方法的关键在于建立递归关系。这里的递归关系可以是递归描述的,也可以是递推描述的。下面由一个求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<

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