C语言中函数嵌套调用和递归调用
C语言中函数嵌套调用和递归调用
函数嵌套与递归调用的区别
函数嵌套是语言特性,递归调用是逻辑思想。
1 函数嵌套
函数嵌套允许在一个函数中调用另外一个函数,比如有三个函数
例:
funca()
{
funcb();
}
funcb()
{
funcc();
}
funcc()
{
cout << "Hello" <<endl;
}
这个就叫做嵌套调用,它是一个语言提供的程序设计的方法,也就是语言的特性。
2 递归调用
而递归是一种解决方案,一种思想,将一个大工作分为逐渐减小的小工作,比如说一个和尚要搬50块石头,他想,只要先搬走49块,那剩下的一块就能搬完了,然后考虑那49块,只要先搬走48块,那剩下的一块就能搬完了……,递归是一种思想,只不过在程序中,就是依靠函数嵌套这个特性来实现了。
递归最明显的特点就是,自己调用自己。
例:
funca()
{
if(statement1)
funca();
else
exit(0);
}
3 总结
概括说,函数嵌套就是函数调用函数,是普遍的,递归就是函数调用自身,使函数嵌套的一个特例。
嵌套调用就是某个函数调用另外一个函数,递归调用是一个函数直接或间接的调用自己。
举几个例子:A调用B(嵌套)B调用C(嵌套)A调用A(递归)A 调用B B调用A (递归)A调用B B调用C C调用A (递归)。
C语言第七讲 函数(2)
21
一、变量的存储空间分配概念
变量定义位置 变量的作用域 空间 (变量的使用范围)
变量的存储类别变量的生存期 时间
26
局部变量
二、变量的作用域——
局部变量(local variable)与全局变量(global variable)
例
void swap( ) { int t,x,y; t=x;x=y;y=t; } main() { int x=3,y=5; printf("x=%d,y=%d\n",x,y); swap( ); printf("x=%d,y=%d\n",x,y); }
斐波那契数列的递归方法实现。计算并输出斐波 那契数列的前7个数据。
1 当n =0, 1时
fib(n) =
fib(n-1)+ fib(n-2) 当n > 1时
int fib(int n) { if(n==0||n==1) return 1; else return fib(n-1)+fib(n-2); }
10
void main() { int n; for(n=11;n<=99;n++) if( absoluteprime(n) ) printf("%d\t",n); } /*判断一个数是否为绝对素数*/ int absoluteprime (int n) /*函数定义*/ { if(prime(n)==0) return 0; else if(prime(invert(n))==1) return 1; else return 0; }
大学C语言程序设计 第六章
2.函数表达式: 2.函数表达式: 函数表达式
功能:将函数作为表达式的一部分。 功能:将函数作为表达式的一部分。 如: c=2*max(a,b); 要点:要求函数带回一个确定的值,以参加表达式的运算。 要点:要求函数带回一个确定的值,以参加表达式的运算。
3.一个函数作为另一个函数的参数: 3.一个函数作为另一个函数的参数: 一个函数作为另一个函数的参数
若不需要函数带回任何值,可使用: 若不需要函数带回任何值,可使用:
void printstar(){ …} } void print_message(){…} print_message(){ }
例exp6_5:函数返回值的类型与其定义的 exp6_5:函数返回值的类型与其定义的 类型不符的情况。 类型不符的情况。
一函数的定义重点二函数的调用重点1函数的一般调用2函数的嵌套调用3函数的递归调用三数组作为函数的参数难点四局部变量与全局变量难点五变量的存储类别难点六内部函数与外部函数1概述2函数定义的方法重点3函数的参数难点4函数的返回值难点1c程序的基本结构回顾2什么是函数
第六章
[教学要求] 教学要求]
函
数
1.理解函数的功能。 理解函数的功能。 2.掌握函数定义的一般形式(重点)。 掌握函数定义的一般形式(重点)。 掌握函数的形参与实参的对应关系、 3.掌握函数的形参与实参的对应关系、参数传递方法及函数返回值 的概念(难点) 的概念(难点) 。 掌握函数调用的基本方法(重点) 4.掌握函数调用的基本方法(重点) 。 掌握函数嵌套调用的一般过程(重点) 5.掌握函数嵌套调用的一般过程(重点) 。 了解函数递归调用的几种形式。 6.了解函数递归调用的几种形式。 掌握数组名作为函数的参数的一些特点(难点) 7.掌握数组名作为函数的参数的一些特点(难点) 。 8.掌握局部变量与全局变量的概念及它们的使用特点(难点) 。 掌握局部变量与全局变量的概念及它们的使用特点(难点) 掌握动态存储变量与静态存储变量的含义,会正确识别和使用。 9.掌握动态存储变量与静态存储变量的含义,会正确识别和使用。 10.了解内部函数与外部函数的含义。 10.了解内部函数与外部函数的含义。
《C程序设计》(第三版)第8章 函数(嵌套及递归调用)
递归算法必须有结束递归条件,否则会产生死机现象! 递归算法必须有结束递归条件,否则会产生死机现象!
11
2.递归函数的执行过程
【例】编一递归函数求n!。 编一递归函数求 。
思路:以求 的阶乘为例 的阶乘为例: 思路:以求4的阶乘为例 4!=4*3!,3!=3*2!,2!=2*1!,1!=1,0!=1。 , , , , 。 递归结束条件: 递归结束条件:当n=1或n=0时,n!=1。 或 时 。 递归公式: 递归公式:
2
(4)函数fun的功能是计算x2-2x+6,主函数中将调用fun函数计算: (4)函数 函数fun的功能是计算 2x+6,主函数中将调用fun函数计算 的功能是计算x 函数计算: y1=(x+8)2-2(x+8)+6 y2=sin2x-2sinx+6 请填空。 请填空。 #include<math.h> fun(double x) double ; main() { double x,y1,y2; scanf(“%lf”,&x); x+8 y1=fun( ); sin(x) ); y2=fun( printf(“y1=%lf,y2=%lf\ printf(“y1=%lf,y2=%lf\n”,y1,y2); } double fun(double x) { return (x*x-2*x+6); } (x*x3
C19-函数(二)
数组元素作为函数实参
数组元素作为函数参数
实例19-4:统计字符串中字母的个数。
int isalp(char c) { if(c>='a'&&c<='z'||c>='A'&&c<='Z') return(1); else return(0); }
main( ) { int i,num=0; char str[255]; printf("Input a string: "); gets(str); for(i=0;str[i]!='\0';i++) if (isalp(str[i])) num++; puts(str); printf("num=%d\n",num); }
比如n=5: 第一部分:n!=n*(n-1)!=5*4! 第二部分:(n-1)!=(n-1)*(n-2)!=4*3! 第三部分:(n-2)!=(n-2)*(n-3)!=3*2! 第四部分:(n-3)!=(n-3)*(n-4)!=2*1! 第五部分:(n-4)!=(n-4)*(n-5)!=1,得到值1,结束递归。
printf(“max=%d\n”,m);
}
{
return((x>y)? x:y); }
函数的嵌套调用 实例19-2:计算 s 1 2 3 n
k k k k
#define K 4 #define N 5 main( ) { printf(“Sum of %d powers of integers from 1 to %d = ”, K,N); printf(“%d\n”,f2(N,K));
c语言函数定义的语法
c语言函数定义的语法C语言函数定义的语法是学习C语言编程的基础,在编写C程序时,函数的正确定义和使用是非常重要的。
本文将详细介绍C语言函数定义的语法,包括函数的声明、参数、返回值和函数体的组成。
一、函数的声明在C语言中,函数的声明既可以放在主函数之前,也可以放在主函数之后。
函数的声明包括函数的返回类型、函数名和参数列表。
例如:int sum(int a, int b);上述代码中,int表示函数的返回类型是整数,sum是函数的名字,而int a和int b是函数的参数列表,表示函数接受两个整型参数。
二、函数的定义函数的定义包括函数的声明和函数体。
函数体由一对花括号{}包围,花括号中是函数的具体实现代码。
例如:int sum(int a, int b){int result = a + b;return result;}上述代码中,函数的定义与函数的声明相对应。
函数体中的代码是实现函数功能的具体代码,使用了两个参数a和b,计算它们的和并将结果返回。
三、参数传递C语言函数可以接受参数,参数可以是基本数据类型,也可以是数组或指针。
参数通过参数列表的形式传递给函数。
例如:void printName(char name[]){printf("My name is %s\n", name);}上述代码中,printName函数接受一个字符数组作为参数,然后将其打印出来。
四、返回值C语言函数可以有返回值,返回值可以是基本数据类型,也可以是数组或指针。
函数的返回值通过return语句返回。
例如:int square(int num){return num * num;}上述代码中,square函数接受一个整数作为参数,计算该整数的平方并返回。
五、函数的调用在C语言程序中,函数的调用是通过函数名和实参列表来完成的。
例如:int main(){int a = 2;int b = 3;int result = sum(a, b);printf("The sum of %d and %d is %d\n", a, b, result);return 0;}上述代码中,main函数是程序的入口函数,首先定义了两个整数变量a和b,然后调用了sum函数计算它们的和,并将结果打印出来。
c语言函数调用例子
c语言函数调用例子函数调用是C语言中常用的一种语法结构,通过函数调用可以实现代码的模块化和复用。
下面列举了十个不同的C语言函数调用的例子,以展示函数调用的不同用法和特点。
1. 系统库函数的调用系统库函数是C语言提供的一些常用函数,可以直接调用来完成一些常见的操作。
例如,可以使用printf函数来输出字符串到标准输出:```c#include <stdio.h>int main() {printf("Hello, World!\n");return 0;}```2. 自定义函数的调用除了系统库函数,我们也可以自己定义函数来实现特定的功能。
例如,可以定义一个函数来计算两个整数的和,并在主函数中调用该函数:```c#include <stdio.h>int add(int a, int b) {return a + b;}int main() {int a = 3, b = 5;int sum = add(a, b);printf("The sum of %d and %d is %d\n", a, b, sum);return 0;}```3. 函数的递归调用递归是一种函数调用自身的方法,可以解决一些需要重复执行的问题。
例如,可以使用递归函数来计算斐波那契数列的第n项:```c#include <stdio.h>int fibonacci(int n) {if (n <= 1) {return n;} else {return fibonacci(n - 1) + fibonacci(n - 2);}}int main() {int n = 10;int result = fibonacci(n);printf("The %dth Fibonacci number is %d\n", n, result);return 0;}```4. 函数的多次调用一个函数可以被多次调用,每次调用可以传入不同的参数。
c语言函数的嵌套和递归调用方法的实验小结
C语言函数的嵌套和递归调用方法的实验小结一、引言在C语言程序设计中,函数的嵌套和递归调用是两种常用的方法,它们在解决问题和实现特定功能时具有重要作用。
本文将结合实验结果,对C语言函数的嵌套和递归调用方法进行总结和分析,旨在加深对这两种方法的理解和应用。
二、函数的嵌套1. 概念与特点函数的嵌套是指在一个函数内部调用另一个函数。
当函数A中调用了函数B,函数B又调用了函数C,函数C又调用了函数D时,就形成了函数的嵌套调用。
函数的嵌套具有以下特点:(1)提高了程序的模块化和可读性,减少了代码的复杂度。
(2)可以在不同的函数之间传递参数,实现更灵活的功能组合。
(3)需要注意函数的声明顺序和作用域,避免出现未声明的函数引用错误。
2. 实验验证为了验证函数的嵌套调用,在实验中我们设计了一个简单的例子:编写两个函数,分别实现计算阶乘和计算组合数的功能,然后在主函数中进行嵌套调用,计算组合数的值。
实验结果表明,函数的嵌套调用可以实现相互依赖的功能模块,在程序设计中具有一定的灵活性和适用性。
三、递归调用1. 概念与特点递归调用是指一个函数在执行过程中调用了自身,从而形成了一种函数调用的循环结构。
通过递归调用,可以使函数不断重复执行,直到满足特定的条件才停止。
递归调用具有以下特点:(1)简化了程序的结构,使代码更加清晰和易于理解。
(2)能够处理一些需要多级嵌套的问题,极大地提高了代码的复用性和灵活性。
(3)需要设置递归调用的终止条件,避免形成无限循环,导致程序崩溃。
2. 实验验证为了验证递归调用的功能和特点,我们设计了一个典型的递归程序:计算斐波那契数列的前n项值。
实验结果表明,递归调用在实现该问题时具有简洁、高效的特点,使得代码易于阅读和理解,优雅地解决了该问题。
四、两种方法的比较1. 灵活性与适用性函数的嵌套调用主要适用于需要实现不同功能模块之间的交互和依赖关系的情况,具有较强的灵活性和可扩展性。
递归调用主要适用于解决问题具有明显的递归结构或需要多级嵌套的情况,具有较好的适用性和简洁性。
C6C语言学习资料9.
第六章函数⏹函数的基本使用⏹函数的嵌套调用⏹函数的递归调用⏹变量存储特征⏹宏函数的概念k! n!+m! f=1;for(i=1; i<=n; i++) f=f*i;scanf("%d%d%d", &m, &n, &k);fk=1;for(i=1; i<=k; i++)fk = fk*i;fm=1;for(i=1; i<=m; i++)fm = fm*i;fn=1;for(i=1; i<=n; i++)fn = fn*i;printf("%f\n", fm/(fn+fk));反复使用的代码段# include <stdio.h>void main(){int k, m, n;float fk, fm, fn;scanf("%d%d%d", &m, &n, &k); fk=1;for(i=1; i<=k; i++)fk = fk*i;fm=1;for(i=1; i<=m; i++)fm = fm*i;fn=1;for(i=1; i<=n; i++)fn = fn*i;printf("%f\n", fm/(fn+fk));} # include <stdio.h>void main(){int k, m, n;float fk, fm, fn;float fact(int n);scanf("%d%d%d", &m, &n, &k); fm = fact(m);fn = fact(n);fk = fact(k);printf("%f\n", fm/(fn+fk));}float fact(int n){ int i;float f=1;for(i=1; i<=n; i++)f=f*i;return f;}# include <stdio.h>void main(){int k, m, n;float fk, fm, fn;float fact(int n);scanf("%d%d%d", &m, &n, &k);fm = fact(m);fn = fact(n);fk = fact(k);printf("%f\n", fm/(fn+fk));}float fact(int n){ int i;float f=1;for(i=1; i<=n; i++)f=f*i;return f;}mainscanf printffact库函数自定义函数库函数main 主调函数fact 被调用函数调用定义函数的概念⏹库函数 scanf() printf() sqrt()⏹功能独立,反复使用的代码段计算阶乘 fact()⏹模块化编程学生成绩档案管理软件┌─────┬─┴──┬────┐成绩输入成绩修改成绩统计成绩打印# include <stdio.h>void main(){int in;printf("1. INPUT 2.EDIT 3. PROCESS 4.PRINT 5.EXIT\n"); while(1){printf("please input 1-5:");scanf("%d",&in);if (in==5) break;switch(in) {case 1: input( ); break;case 2: edit( ); break;case 3: process( ); break;case 4: print( ); break;}}}void input( ) /* .成绩输入 */{...............}void edit( ) /* 成绩修改 */{..............}4个函数的定义void process( ) /* 成绩统计 */{...............}void print( ) /* 成绩打印 */{...............}void main() {int m, n; float fk, fm, fn; float fact(int n);fm = fact(6); …… }调用定义float fact(int n) { int i; float f=1;for(i=1; i<=n; i++) f=f*i; return f; }返回值类型 函数名(形式参数表) {…… }void main() {int m, n; float fk, fm, fn; float fact(int n);fm = fact(6); …… }float fact(int n) { int i; float f=1;for(i=1; i<=n; i++) f=f*i; return f; }调用 定义 函数名(实际参数表)参数传递返回值类型 函数名(形式参数表) {…… }void main() {int m, n; float fk, fm, fn; float fact(int n);fm = fact(6); …… }float fact(int n) { int i; float f=1;for(i=1; i<=n; i++) f=f*i; return f; }1、函数的参数 ⏹形式参数类型1 参数1,类型2 参数2,……类型n 参数n定义函数时需要知道的信息 参数个数:0-n ⏹实际参数调用时由主调函数给出,实参 -> 形参函数的参数函数名(实际参数表)main(){……output( );……}void output( ){printf(”**************\n”);printf(”* very good *\n”);printf(”**************\n”);} main( ){int x,y,z;scanf(“%d%d”,&x,&y); z=max(x, y);printf(“%d”,z);}int max (int a , int b ) { int c ;c=a>b ? a : b ;return( c ) ;}问题:实参可以是表达式吗?如果实参和形参的类型不一样?返回值类型 函数名(形式参数表) {…… }void main() {int m, n; float fk, fm, fn; float fact(int n);fm = fact(6); …… }float fact(int n) { int i; float f=1;for(i=1; i<=n; i++) f=f*i; return f; }2、返回值类型函数返回一个值,合法类型return (exp);函数的返回值main() {…… output(); …… }void output( ) {printf(”**************\n”); printf(”* very good *\n”); printf(”**************\n”); }2、返回值类型⏹函数返回一个值,合法类型return (f );⏹函数不返回值,voidreturn; 或省略 返回值类型缺省是 int main( ){ int x,y,z;scanf(“%d%d”,&x,&y); z=max(x,y); printf(“%d”,z); }max(int a , int b ){int c ;c=a>b ? a : b ;return( c ) ; }int 问题:如果返回值的类型与return (exp) 中的exp 不一致?实参void main() {int x, y, z;scanf(“%d%d”,&x,&y); z=max( x, y ); printf(“%d”,z) }int max(int a , int b ) {int c;c=a>b ? a : b; return c; }常量变量 表达式形参:变量int max(int a , int b ) {int c;c=a>b ? a : b; return c; }void main() {int x, y, z;scanf(“%d%d”,&x,&y); z=max( x, y ); printf(“%d”,z) }x 3 y 5za bc5 3551、实参与形参:个数相同、类型一致、按顺序传递2、实参 -> 形参,值传递单向 形参值的变化不会影响实参的值 实参和形参可以同名void main() {int x, y, z;scanf(“%d%d”,&x,&y); z=max( x, y ); printf(“%d”,z) }int max(int a , int b ) {int c;c=a>b ? a : b; return c; }void main( ) {int x, y;scanf("%d%d", &x, &y); swap(x, y);printf("%d%d", x, y); } 阅读程序void swap(int x, int y) {int t; t = x; x = y; y = t; }输入 3 5函数的说明void swap(int a, int b){int t;t = a;a = b;b = t;}void main( ){int x, y;scanf("%d%d", &x, &y); swap(x, y);printf("%d%d", x, y);} void main( ){int x, y;scanf("%d%d", &x, &y); swap(x, y);printf("%d%d", x, y);}void swap(int a, int b){int t;t = a;a = b;b = t;}void swap(int a, int b);函数在被调用前必须先定义或说明!函数调用小结函数调用时,实参计算值,复制给相应位置的形参;函数执行完后,通过return (exp),可返回结果。
C语言程序设计(李圣良)章 (5)
printf("%3d",score[i]); printf("\n"); pass(score,10);
第5单元 函 数
printf("处理之后的成绩如下:\n"); for(i=0;i<10;i++)
printf("%3d",score[i]); printf("\n"); } void pass(int array[],int n) { int i; for(i=0;i<n;i++)
function(); }
第5单元 函 数 图5-2 例5-4程序运行结果
第5单元 函 数
5.2.2 函数的声明 在C语言中,除了main函数外,用户所定义的函数遵循
“先定义、后使用”的规则。当把函数的定义放在调用之后, 应该在调用之前对函数进行声明,即在所调用的函数之后定义, 则在调用函数之前需要对被调函数进行声明。
第5单元 函 数
(2) 调用的函数仅仅是完成某些操作而不返回函数值,这 时函数的调用可以作为一条独立的语句。
【例5-4】 读程序,理解无返回值的函数调用。
#include <stdio.h> void function() {
printf(“Hello,World!\n”); } main() {
{
int z;
/* 求得的最大公约数用z存放 */
实现函数功能的语句
return (z);
/* return语句带回返回值 */
}
《C语言程序设计·中国水利水电版》AB第4章:函数
4.1.1 函数的定义
函数定义的一般格式为:
函数类型 函数名( 形式参数表)
{
语句组
函数体
}
函数头
第4章 函数
例4.1 求两个整数中较大的值的函数
#include <iostream.h>
函数的返回值由函数体中的return语句给出。
return语句的一般格式为:
return (表达式); 执行该语句时,不带回返回
或 return 表达式;
值,只是返回主调函数
或 return ;
函数的类型要与return语句的返回值类型相同。若不一致则以 函数类型为准,将返回值类型转换为函数类型,若不能转换,则
第4章 函数
例4.4 引用的使用
#include <iostream.h>
void main()
{ int a=1;
定义引用b,并将其作为a的别名
int c=10; int &b = a;
将c的值赋给b,不是将b作为c的别名
cout << a << ", " << b <<", " << c << endl;
for(i=1; i<=m; i++)
s *= i;
return s;
}
第4章 函数
例4.7 输入两个整数,求平方和
#include <iostream.h>
int fun2(int m);
C语言程序设计教程第四章练习题解析(1)
B.4
C.5
D.6
答案:A
解析:(v1, v2),(v3,v4,v5)和v6一共三个实参
3、关于C语言中print()函数与scanf()函数,下列描述中正确的是()
A.printf()函数可以向任何地方输出数据
B.printf()只向控制台输出数据
C.scanf()只能输入英文字母和数字
D.scanf()函数可以识别输入的空格
s=2;
else
s=n-fun(n-1);
return s;
}
void main()
{
printf("%ld\n", fun(3));
}
A.1
B.2
C.3
D.4
答案:A
解析:fun()函数传入3时,返回3-fun(2);fun()函数传入2时,返回2。所以fun(3)返回3-2=1。
23、在C语言中,函数的隐含存储类别是()。
12、C语言程序的基本单位是()。
A.程序行
B.语句
C.函数
D.字符
答案:C
解析:函数是C语言程序的基本单位
13、C语言中决定函数返回值的类型的是()。
A.return语句中的表达式类型
B.调用函数的主调函数类型
C.调用函数时临时
D.定义函数时所指定的函数类型
答案:D
解析:函数的返回值取决于定义函数时指定的返回值类型
28、下列程序的输出结果是()。
int b=2;
int func(int *a)
{
b += *a;
return b;
}
void main()
{
int a=2, res=2;
第6章 函数
• 函数定义的一般形式
函数名(形式参数表列) 类型标识符 函数名(形式参数表列) {声明部分 执行部分 } 例6.2 •函数名符合标识符的命名规则,同一程序中函数不能重名。 •对于无参函数,形参表是空的,但“()”不能省略。对于有 参函数,需要说明每一个形式参数的类型;若多于一个形参, 则形参之间用逗号分隔。 •函数名前的类型标识符用来说明函数返回值的类型,函数 返回值通过return语句得到。若函数无返回值,可用类型标 识符“void”表示. •花括弧内部分称为“函数体”,由声明部分和执行部分构 成。声明部分对函数内变量的类型和被调函数的原型进行定 义和声明;执行部分是实现函数功能语句序列。 上一页
• 函数的调用
–形式: 函数名(实际参数表列) 函数名(实际参数表列) –调用函数的过程是:
• 为函数的所有形参分配内存单元,计算各个实参表达式 的值,一一对应的赋值给相应形参。 • 进入函数体,执行函数中的语句,实现函数的功能,执 行到return语句时,计算return语句中表达式的值,释 放形参及本函数内的局部变量所占内存,返回主调函数。 • 继续执行主调函数中的后继语句。 例6.4 例6.5
– 可采用递归算法解决的问题的特点:原始的问
上一页
例6.9
–递归调用的过程分为:
① 递归过程:将原始问题不断转化为规模小了一级的新问题, 从未知向已知推进,最终达到递归终结条件; ② 回溯过程:从已知条件出发,沿递归的逆过程,逐一求值返 回,直至递归初始处,完成递归调用。 上一页
6.4 变量的作用域和存储类别
– 外部变量的声明(extern声明) 声明) 外部变量的声明(extern声明
•定义性声明:需要分配存储空间,既是声明又是定义。 •引用性声明:说明函数中将要使用该函数外已定义的变量。 •外部变量的定义在函数的外部,使用在函数的内部。外部 变量应该在使用前先声明。外部变量的定义只有一次,但 声明可以有多次。 •采用extern说明符来声明外部变量。对外部变量的声明可 上一页 以在函数的内部,也可以在函数的外部。
C13第7章 函数(3)
例7-27 汉诺塔问题。
设A座上有n个盘子。 座上有n个盘子。 如果n 如果n为1时,即A座上只有一个盘子,则把它直接移到C座上 座上只有一个盘子,则把它直接移到C 否则,用下面三步完成任务: 否则,用下面三步完成任务: 第一步, 第一步,把A座上的n-1个盘子先利用C座移动到B座上。 座上的n 个盘子先利用C座移动到B座上。 第二步, 第二步,把A座上仅有的第n个盘子移动到C座上。 座上仅有的第n个盘子移动到C座上。 第三步,把B座上的n-1个盘子利用A座移动到C座上。 第三步, 座上的n 个盘子利用A座移动到C座上。
分析upstairs(4)的运行情况
upstairs(4) upstairs(3) + upstairs(2) upstairs(2) + upstairs(1)
Hale Waihona Puke 程序的输出为void main( ) { printf(“4阶楼梯有 种不同的走法 阶楼梯有%d种不同的走法 阶楼梯有 种不同的走法\n”, upstairs(4));}
例7-24
例7-25
编写一个递归函数isPalin判断字符数组中的字符串是 编写一个递归函数isPalin判断字符数组中的字符串是 isPalin 否为回文,是则返回1 不是返回0 否为回文,是则返回1,不是返回0。
例7-27
汉诺塔问题。
古代有一个梵塔,塔内有3个标示为A 古代有一个梵塔,塔内有3个标示为A、B、C的座,A座 的座, 上有5个大小不等的盘子,大的在下面,小的在上面, 上有5个大小不等的盘子,大的在下面,小的在上面,如 图7-8所示。现要求把5个盘子从A座移动到C座,每次只允 所示。现要求把5个盘子从A座移动到C 许移动一个盘子,在移动过程中可以利用B座,但是3个座 许移动一个盘子,在移动过程中可以利用B 但是3 上要始终保持大盘在下面,小盘在上面。 上要始终保持大盘在下面,小盘在上面。
c语言第八章 函数
教学进程
8.2
函数的调用
【练习题 】
用函数实现求两个实数的和。
#include <stdio.h> void main() /*主调函数*/ { float add(float x, float y); /*函数声明*/ float a,b,c; printf("Please enter a and b:"); scanf("%f,%f",&a,&b); c=add(a,b); 因函数声明与函数首 printf("sum is %f\n",c); 部一致,故把函数声 } 明称为函数原型。 float add(float x,float y) /*被调函数首部*/ { float z; z=x+y; 用函数原型来声明函数,能减少 return(z); 编写程序时可能出现的错误。 }
教学进程
8.2.3 函数的调用
定义函数时,函数名后括号中的变量称为形式参数,即形参。 定义函数时,函数名后括号中的变量称为形式参数,即形参。 在主函数中调用函数时,函数名后括号中的表达式称为实际 参数,简称实参。
【例 】 输入两个整数,要求用一个函数求出其中的大者,并 在主函数中输出此数。
教学进程
a
b
c
d
e
f
教学进程
运行结果: 【例】 函数调用的简单例子。
**************** How do you do! ****************
/*主调函数*/ /*主调函数* #include <stdio.h> void main() { void printstar(); printstar(); void print_message(); print_message(); printstar(); print_message(); printstar(); }
829-C语言简答题
一、简答部分:(*号为重点程度)1.关键字和一般标识符有什么不同?(***)标识符使用来标识源程序中的某个对象的名字的,一个标识符由字母、数字和下划线组成关键字可以定义变量、表达语句功能和对一些文件进行预处理,关键字已被编译系统本身使用,所以用户编写程序时不能够使用这些关键字来作为标识符,如unsigned char,int,long,if,for,include,define等。
2.if语句中的条件表达式可以是任意合法的表达式吗? switch语句中break的作用是什么?(****)可以是任意数值。
在switch语句中,break语句可使流程立即跳出switch语句体不执行其他的case。
3.三种循环结构中的条件是循环进行的条件还是循环结束的条件?循环结构中break语句和continue语句的作用是什么,二者有何区别?(*****) for语句、while语句:循环进行的条件;do-while语句:循环结束的语句。
break可用于switch语句,表示跳出整个switch块,而continue则不能用于switch语句它们都可用于循环语句的循环体,break用于立即退出当前循环,而continue 仅跳过当次循环,本次循环体内不执行continue语句后的其它语句,但下次循环还会执行。
4.字符数组与字符串是否相同?若不相同,有何区别?(*****)不相同,C语言中没有专门的字符串变量,如果要将一个字符串存放在变量中,必须使用字符数组,即用一个字符型数组来存放一个字符串,数组中每一个元素存放一个字符。
字符串:必须以'\0'结尾,字符数组:可以包含多个'\0'。
5.函数的嵌套调用与递归调用有什么区别?(****)函数嵌套允许在一个函数中调用另外一个函数,递归调用是调用本身的函数。
函数嵌套就是函数调用函数,是普遍的,递归就是函数调用自身,是函数嵌套的一个特例。
6.结构体类型与我们前面学过的基本类型有哪些区别?(*****)结构体是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型。
C语言程序设计教程第四章练习题解析(1)
单选题1、关于C语言中的函数,下列描述正确的是()A。
函数的定义可以嵌套,但函数的调用不可以嵌套B.函数的定义不可以嵌套,但函数的调用可以嵌套C.函数的定义和函数的嵌套均不可以嵌套D.函数的定义和函数的调用均不可以嵌套答案:B解析:函数的定义不可以嵌套,但函数的调用可以嵌套2、定义一个函数:exce((v1, v2), (v3,v4,v5),v6); 在该函数调用时,实参的个数为()个A.3B。
4C。
5D.6答案:A解析:(v1,v2),(v3,v4,v5)和v6一共三个实参3、关于C语言中print()函数与scanf()函数,下列描述中正确的是()A。
printf()函数可以向任何地方输出数据B。
printf()只向控制台输出数据C。
scanf()只能输入英文字母和数字D.scanf()函数可以识别输入的空格答案:B解析:printf()是向控制台输出的函数4、在C语言中,内部函数需要添加的关键字是()A.externB.staticC.thisD。
auto答案:B解析:在定义内部函数时,需要在函数的返回值类型前面添加static关键字(又称为静态函数)。
5、当调用时,会调用内部函数A。
当调用时,会调用内部函数B。
当调用时,会调用外部函数C。
当调用时,会调用两次,先调用内部函数再调用外部函数D。
都不调用,会报错答案:A解析:当内部函数与外部函数重名时,会优先调用内部函数6、在C语言中,声明外部函数需要添加的关键字是( )A。
externB。
staticC。
thisD.auto解析:声明外部函数的方式是在函数的返回值类型前面添加extern关键字7、关于C语言中的局部变量,下列描述中错误的是( )A.局部变量就是在函数内部声明的变量B.局部变量只在函数内部有效C.局部变量只有当它所在的函数被调用时才会被使用D。
局部变量一旦被调用,其生存周期持续到程序结束答案:D解析:当函数调用结束时局部变量就会失去作用8、关于C语言中的全局变量,下列描述中正确的是()A。
[练习]C语言实验七、函数程序设计答案
实验七 函数及程序结构(二)一、实验目的1.掌握函数的嵌套调用和递归调用2.掌握数组做函数参数的用法3.掌握全局变量和局部变量的用法。
?4.掌握变量的存储类别。
?二、实验内容1.[目的]掌握函数的嵌套调用方法。
[题目内容] 编写程序计算cb a 。
要求设计主函数main()读取a 、b 、c 的值,并调用ratio 函数计算a/(b-c)的值。
如果(b-c)=0那么ratio 就不能计算,因此,ratio 函数调用另一个函数dif ,以测试(b-c)的差是否为零,如果b 不等于c ,dif 返回1,否则返回0。
[输入] a 、b 、c 的值[输出] 计算结果[提示] main 函数调用ratio 函数,ratio 函数调用dif 函数。
三个函数平行定义,嵌套调用。
#include <stdio.h>void main(){float ratio(int x,int y ,int z);int dif(int x,int y);int a,b,c;float d;printf("请输入a,b,c:");scanf("%d%d%d",&a,&b,&c);d=ratio(a,b,c);if(d==0.0) printf("b-c 为零。
");else printf("%d/(%d-%d)=%f\n",a,b,c,d);}float ratio(int x,int y ,int z){if(dif(y ,z)==1) return (float)x/(float)(y-z);else return 0.0;}int dif(int x,int y){if(x==y) return 0;else return 1;}2.[目的]利用标准库提供的随机数功能。
[题目内容]编写程序,帮助小学生练习乘法计算。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
函数嵌套与递归调用的区别
函数嵌套是语言特性,递归调用是逻辑思想。
1 函数嵌套
函数嵌套允许在一个函数中调用另外一个函数,比如有三个函数
例:
funca()
{
funcb();
}
funcb()
{
funcc();
}
funcc()
{
cout << "Hello" <<endl;
}
这个就叫做嵌套调用,它是一个语言提供的程序设计的方法,也就是语言的特性。
2 递归调用
而递归是一种解决方案,一种思想,将一个大工作分为逐渐减小的小工作,比如说一个和尚要搬50块石头,他想,只要先搬走49块,那剩下的一块就能搬完了,然后考虑那49块,只要先搬走48块,那剩下的一块就能搬完了……,递归是一种思想,只不过在程序中,就是依靠函数嵌套这个特性来实现了。
递归最明显的特点就是,自己调用自己。
例:
funca()
{
if(statement1)
funca();
else
exit(0);
}
3 总结
概括说,函数嵌套就是函数调用函数,是普遍的,递归就是函数调用自身,使函数嵌套的一个特例。
嵌套调用就是某个函数调用另外一个函数,递归调用是一个函数直接或间接的调用自己。
举几个例子:A调用B(嵌套)B调用C(嵌套)A调用A(递归)A 调用B B调用A (递归)A调用B B调用C C调用A (递归)。