任务28:函数的递归调用 《编程语言-C语言》45分钟专题训练
|
2份
|
29页
|
98人阅读
|
1人下载
内容正文:
湖南省职教高考《编程语言—C语言》45分钟专题训练专辑,共43份试卷。试卷命题与高考紧密相关,精选具有代表性和典型性的高考常考题。旨在帮助学生系统地复习和巩固计算机类理论知识,熟悉高考题型和命题规律,提高解题能力和应试技巧,为高考取得优异成绩打下坚实的基础,本训练卷适用于即将参加计算机类高考的学生。与本专辑配套的还有湖南省职教高考《计算机应用基础》《计算机组装与维护》《计算机网络技术》45分钟专题训练专辑,欢迎同学和老师们下载使用。
《编程语言—C语言》
项目五: 函数
第28卷: 函数的递归调用
时间:45分钟 总分:100分
班级___________ 姓名__________ 学号__________ 成绩________
一、选择题(共23小题,每小题2分,共46分)
1.下列有关递归函数的叙述中,不正确的一项是( )
A.C语言允许直接递归调用和间接递归调用
B.递归函数通常有出口结束递归
C.递归函数的效率一定比功能等价的非递归函数效率低
D.递归函数通常有书写简单和形式直观的优点
2.下列叙述中,正确的一项是( )
A.简单递归不需要明确结束递归的条件
B.任何情况下都不能用函数名作为实参
C.函数的递归调用不需要额外开销,所有效率极高
D.函数既可以直接调用自己,也可以间接调用自己
3.下列程序的功能是求n!,最适合填入第【1】空的内容是。( )
int fun(int n)
{if(n==0||n==1) return 【1】;
return【2】;}
main()
{int n;
scanf("%d",&n);
printf("%d",fun(n));
getch();}
A.1 B.0 C.2 D.-1
4. 列程序的功能是求n!,最适合填入第【2】空的内容是。( )
int fun(int n)
{if(【1】) return 1;
return【2】;}
main()
{int n;
scanf("%d",&n);
printf("%d",fun(n));
getch();}
A.B.C.D.n==0||n==1
A.fun(n-1) B.fun(n-1)*n C.fun(n)*n D.fun(n+1)*n
5.下列程序的功能是打印杨辉三角形的前10行,请你为第【1】空,选择合适的内容。( )
int fun(int x,int y)
{if(x==0||y==0||x==y) return 1;
return 【1】+【2】;}
main()
{int i,j;
for(i=0;i<10;i++,printf("
"))
for(j=0;j<=i;j++)
printf("%5d",fun(i,j));getch();}
A.fun(x-1,y) B.fun(x--,y) C.fun(x,y) D.fun(x,y-1)
6.下列程序的功能是打印杨辉三角形的前10行,请你为第【2】空,选择合适的内容。( )
int fun(int x,int y)
{if(x==0||y==0||x==y) return 1;
return 【1】+【2】;}
main()
{int i,j;
for(i=0;i<10;i++,printf("
"))
for(j=0;j<=i;j++)
printf("%5d",fun(i,j));getch();}
A.fun(x,y) B.fun(x++,y++) C.fun(x-1,y) D.fun(x-1,y-1)
7.以下程序的功能是用递归法计算5位学生的年龄,已知第一位学生年龄最小为10岁,其余学生一个比一个大2岁,求第5位学生的年龄,请你为第【1】空选择合适的内容。( )
int age(int n)
{ int c;
if(【1】) c=10;
else c=【2】;
return(c);}
main( )
{ int n=5;
printf("age:%d
",age(n));getch();}
A.n==1 B.n==0 C.n!=0 D.n!=1
8.以下程序的功能是用递归法计算5位学生的年龄,已知第一位学生年龄最小为10岁,其余学生一个比一个大2岁,求第5位学生的年龄,请你为第【2】空选择合适的内容。( )
int age(int n)
{ int c;
if(【1】) c=10;
else c=【2】;
return(c);}
main( )
{ int n=5;
printf("age:%d
",age(n));getch();}
A.age(n-1) B.age(n)+2 C.age(n-2)+2 D.age(n-1)+2
9.执行以下程序段的输出结果是( )
void fun(int a)
{if(a%10) fun(a/10);
printf("%d",a%10);}
main()
{int a=10311;
fun(a);getch();}
A.10311 B.0311 C.1031 D.1311
10.执行以下程序段的输出结果是( )
void fun(int a)
{printf("%d",a%10);
if(a/10) fun(a/10);}
main()
{int a=12345;
fun(a);
getch();}
A.12345 B.12453 C.54321 D.54322
11.执行以下程序段的输出结果是( )
int fun(int n)
{if(n==1||n==2) return 1;
return fun(n-1)+fun(n-2);}
main()
{int i;
for(i=1;i<=6;i++)
printf("%d ",fun(i));getch();}
A.1 1 2 3 5 8 B.1 2 3 5 8 C.1 1 3 5 8 D.1 1 3 4 7 11
12.执行以下程序段的输出结果是( )
int in(char a[ ])
{if(a[0]=='\0') return 0;
in(&a[1]);
printf("%c",a[0]);}
main()
{char s[10]="hello";
in(s);getch();}
A.hello B.heoll C.hlloe D.olleh
13.执行以下程序段的输出结果是( )
int fun(int a,int b)
{if(b==0) return a;
else return(fun(--a,--b));}
main()
{printf("%d",fun(4,2));
getch();}
A.1 B.2 C.3 D.4
14.执行以下程序段的输出结果是( )
int fun(int x)
{int p;
if(x==0||x==1) return 3;
p=x-fun(x-2);
return p;}
main()
{printf("%d",fun(7));getch();}
A.0 B.2 C.3 D.7
15.执行以下程序段时输入:1234<回车>,则输出结果是( )
void getput()
{char ch;
ch=getchar();
if(ch!='
') getput();
putchar(ch);}
main()
{getput();
printf("
");getch();}
A.1111 B.1234 C.4321 D.4444
16.执行以下程序段的输出结果是( )
void fun(int n)
{int i;
if((i=n/10)!=0) fun(i);
putchar (n%10+'0');}
main()
{fun(256);getch();}
A.52 B.256 C.652 D.2560
17.执行以下程序段的输出结果是( )
void fun(int x)
{if(x/2>1) fun(x/2);
printf("%d",x);}
main()
{fun(7);
printf("
");getch();}
A.37 B.36 C.73 D.137
18.若有以下函数定义,执行调用语句:n=fun(3);,则函数fun()总共被调用的次数是( )
int fun(int k)
{if(k<1) return 0;
else if(k==1) return 1;
else return fun(k-1)+1;}
A.2 B.3 C.4 D.5
19.执行以下程序段的输出结果是( )
void convert(char ch)
{if(ch<'D') convert(ch+1);
printf("%c",ch);}
main()
{convert('A');
printf("
");getch();}
A.ABCDDCBA B.ABCD C.DCBA D.A
20.执行以下程序段的输出结果是( )
void fun(char c)
{if(c>'x') fun(c-1);
printf("%c",c);}
main()
{fun('z');
getch();}
A.xyz B.zyx C.wxyz D.zyxw
21.执行以下程序段的输出结果是( )
int fun(int n)
{if(n) return fun(n-1)+n;
else return 0;}
main()
{printf("%d",fun(3));getch();}
A.4 B.5 C.6 D.7
22.执行以下程序段的输出结果是( )
int fun(int n)
{if(n==1) return 1;
else return (n+fun(n-1));}
main()
{int x=10;
x=fun(x);
printf("%d",x);
getch();}
A.45 B.54 C.55 D.65
23.执行以下程序段的输出结果是( )
long fib(int n)
{if(n>2) return(fib(n-1)+fib(n-2));
else return(2);}
main()
{ printf("%ld
",fib(5));
getch();}
A.10 B.5 C.0 D.12
二、程序运行结果题(本题共7小题,每题3分,共21分)
24.以下程序的运行结果是( )
#include <stdio.h>
#include<conio.h>
int sum(int array[ ],int len)
{if(len==0) return array[0];
else return array[0]+sum(array+1,len-1);}
main()
{int array[5]={1,2,3,4,5};
int res=sum(array,4);
printf("%d",res);getch();}
25.以下程序的运行结果是( )
#include <stdio.h>
#include<conio.h>
int f(int x)
{int y;
if(x==0||x==1) return 3;
y=x*x-f(x-1);
return y;}
main()
{int z;z=f(4);
printf("%d",z);getch();}
26.以下程序的运行结果是( )
#include <stdio.h>
#include<conio.h>
int f(int t[ ],int n);
main()
{int a[4]={1,2,3,4},s;
s=f(a,4);
printf("%d
",s);
getch();}
int f(int t[ ],int n)
{if(n>0) return t[n-1]+f(t,n-1);
else return 0;}
27.以下程序的运行结果是( )
#include <stdio.h>
#include<conio.h>
int f(int a[ ],int n)
{if(n>1)
{int t;
t=f(a,n-1);
return t>a[n-1]?t:a[n-1];}
else return a[0];}
main()
{int a[ ]={8,2,9,1,3,6,4,7,5,12,13,21};
printf("%d",f(a,11));getch();}
28.以下程序的运行结果是( )
#include <stdio.h>
#include<conio.h>
int f(int x[ ],int n)
{if(n>1)
{f(&x[1],n-1);
printf("%d,",x[0]);}
else printf("%d,",x[0]);}
main()
{int z[6]={1,2,3,4,5,6};
f(z,6);
printf("
");getch();}
29.以下程序的运行结果是( )
#include <stdio.h>
#include<conio.h>
main()
{ printf("%d ",fact(5));
fact(-5);getch();}
int fact(int value)
{ int f;
if(value<0)
{ printf("Arg error
");
return(-1);}
else if(value==1||value==0) f=1;
else f=value*fact(value-1)+1;
printf("%d ",f);
return f;}
30.以下程序的运行结果是( )
#include <stdio.h>
#include<conio.h>
int f(int n)
{if(n==1) return 1;
else return f(n-1)+1;}
main()
{int i,j=0;
for(i=1;i<3;i++)
j+=f(i);
printf("%d",j);
getch();}
三、阅读程序,修改程序中的错误,不得增行或删行,也不得更改程序结构。请指出错误代码所在的行号,并给出该行修改后的程序代码。每处3分,共9分)
31.下列程序的功能是:使用递归函数的方法求以下多项式的值,在住函数中输入x和n的值,并输出结果。程序中一共有3处错误,请改正。
L1 #include <stdio.h>
L2 #include<conio.h>
L3 float p(int n,int x)
L4 {float f;
L5 if(n==0)
L6 f=1.0;
L7 else if(n=1)
L8 f=x;
L9 else f=((2*n-1)*x*p((n-1),x)-(n)*p((n),x))/n;
L10 return f-1;}
L11 main()
L12 {int n,x;
L13 printf("请输入n与x的值:");
L14 scanf("%d%d",&n,&x);
L15 printf("结果为:%6.2f
",p(n,x));
L16 getch();}
四、程序填空。按照题目要求,将正确的内容填入相应位置,使得程序完整(每空3分,共24分)
32.以下程序的功能是使用递归法求某数a的平方根,求平方根的迭代公式如下所示。请填空。
#include <math.h>
#include <stdio.h>
#include<conio.h>
double mysqrt( double a,double x0)
{ double x1,y;
x1=【1】;
if(【2】>0.00001) y=mysqrt(【3】);
else y=x1;
return 【4】;}
main( )
{double x;
printf("Enter x:");
scanf("%lf",&x);
printf("The sqrt of %f= %f
",x,mysqrt(x,1.0));
getch();}
33.下列程序的功能是求Fibonacci序列的第n项的值。请填空。
#include <stdio.h>
#include<conio.h>
int cnt=0;
int fib(int n)
{【1】;
if(n<=2) return【2】;
else return (【3】+【4】);
}
main()
{int n,result;
printf("输入一个整数:");
scanf("%d",&n);
result=fib(n);
printf("FIB(%d)=%d
",n,result);
printf("递归次数=%d",cnt);
getch();}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$$
湖南省职教高考《编程语言—C语言》45分钟专题训练专辑,共43份试卷。试卷命题与高考紧密相关,精选具有代表性和典型性的高考常考题。旨在帮助学生系统地复习和巩固计算机类理论知识,熟悉高考题型和命题规律,提高解题能力和应试技巧,为高考取得优异成绩打下坚实的基础,本训练卷适用于即将参加计算机类高考的学生。与本专辑配套的还有湖南省职教高考《计算机应用基础》《计算机组装与维护》《计算机网络技术》45分钟专题训练专辑,欢迎同学和老师们下载使用。
《编程语言—C语言》
项目五: 函数
第28卷: 函数的递归调用
时间:45分钟 总分:100分
班级___________ 姓名__________ 学号__________ 成绩________
一、选择题(共23小题,每小题2分,共46分)
1.下列有关递归函数的叙述中,不正确的一项是( )
A.C语言允许直接递归调用和间接递归调用
B.递归函数通常有出口结束递归
C.递归函数的效率一定比功能等价的非递归函数效率低
D.递归函数通常有书写简单和形式直观的优点
【答案】C
2.下列叙述中,正确的一项是( )
A.简单递归不需要明确结束递归的条件
B.任何情况下都不能用函数名作为实参
C.函数的递归调用不需要额外开销,所有效率极高
D.函数既可以直接调用自己,也可以间接调用自己
【答案】D
3.下列程序的功能是求n!,最适合填入第【1】空的内容是。( )
int fun(int n)
{if(n==0||n==1) return 【1】;
return【2】;}
main()
{int n;
scanf("%d",&n);
printf("%d",fun(n));
getch();}
A.1 B.0 C.2 D.-1
【答案】A
4. 列程序的功能是求n!,最适合填入第【2】空的内容是。( )
int fun(int n)
{if(【1】) return 1;
return【2】;}
main()
{int n;
scanf("%d",&n);
printf("%d",fun(n));
getch();}
A.B.C.D.n==0||n==1
A.fun(n-1) B.fun(n-1)*n C.fun(n)*n D.fun(n+1)*n
【答案】B
5.下列程序的功能是打印杨辉三角形的前10行,请你为第【1】空,选择合适的内容。( )
int fun(int x,int y)
{if(x==0||y==0||x==y) return 1;
return 【1】+【2】;}
main()
{int i,j;
for(i=0;i<10;i++,printf("
"))
for(j=0;j<=i;j++)
printf("%5d",fun(i,j));getch();}
A.fun(x-1,y) B.fun(x--,y) C.fun(x,y) D.fun(x,y-1)
【答案】A
6.下列程序的功能是打印杨辉三角形的前10行,请你为第【2】空,选择合适的内容。( )
int fun(int x,int y)
{if(x==0||y==0||x==y) return 1;
return 【1】+【2】;}
main()
{int i,j;
for(i=0;i<10;i++,printf("
"))
for(j=0;j<=i;j++)
printf("%5d",fun(i,j));getch();}
A.fun(x,y) B.fun(x++,y++) C.fun(x-1,y) D.fun(x-1,y-1)
【答案】D
7.以下程序的功能是用递归法计算5位学生的年龄,已知第一位学生年龄最小为10岁,其余学生一个比一个大2岁,求第5位学生的年龄,请你为第【1】空选择合适的内容。( )
int age(int n)
{ int c;
if(【1】) c=10;
else c=【2】;
return(c);}
main( )
{ int n=5;
printf("age:%d
",age(n));getch();}
A.n==1 B.n==0 C.n!=0 D.n!=1
【答案】A
8.以下程序的功能是用递归法计算5位学生的年龄,已知第一位学生年龄最小为10岁,其余学生一个比一个大2岁,求第5位学生的年龄,请你为第【2】空选择合适的内容。( )
int age(int n)
{ int c;
if(【1】) c=10;
else c=【2】;
return(c);}
main( )
{ int n=5;
printf("age:%d
",age(n));getch();}
A.age(n-1) B.age(n)+2 C.age(n-2)+2 D.age(n-1)+2
【答案】D
9.执行以下程序段的输出结果是( )
void fun(int a)
{if(a%10) fun(a/10);
printf("%d",a%10);}
main()
{int a=10311;
fun(a);getch();}
A.10311 B.0311 C.1031 D.1311
【答案】B
10.执行以下程序段的输出结果是( )
void fun(int a)
{printf("%d",a%10);
if(a/10) fun(a/10);}
main()
{int a=12345;
fun(a);
getch();}
A.12345 B.12453 C.54321 D.54322
【答案】C
11.执行以下程序段的输出结果是( )
int fun(int n)
{if(n==1||n==2) return 1;
return fun(n-1)+fun(n-2);}
main()
{int i;
for(i=1;i<=6;i++)
printf("%d ",fun(i));getch();}
A.1 1 2 3 5 8 B.1 2 3 5 8 C.1 1 3 5 8 D.1 1 3 4 7 11
【答案】A
12.执行以下程序段的输出结果是( )
int in(char a[ ])
{if(a[0]=='\0') return 0;
in(&a[1]);
printf("%c",a[0]);}
main()
{char s[10]="hello";
in(s);getch();}
A.hello B.heoll C.hlloe D.olleh
【答案】D
13.执行以下程序段的输出结果是( )
int fun(int a,int b)
{if(b==0) return a;
else return(fun(--a,--b));}
main()
{printf("%d",fun(4,2));
getch();}
A.1 B.2 C.3 D.4
【答案】B
14.执行以下程序段的输出结果是( )
int fun(int x)
{int p;
if(x==0||x==1) return 3;
p=x-fun(x-2);
return p;}
main()
{printf("%d",fun(7));getch();}
A.0 B.2 C.3 D.7
【答案】B
15.执行以下程序段时输入:1234<回车>,则输出结果是( )
void getput()
{char ch;
ch=getchar();
if(ch!='
') getput();
putchar(ch);}
main()
{getput();
printf("
");getch();}
A.1111 B.1234 C.4321 D.4444
【答案】C
16.执行以下程序段的输出结果是( )
void fun(int n)
{int i;
if((i=n/10)!=0) fun(i);
putchar (n%10+'0');}
main()
{fun(256);getch();}
A.52 B.256 C.652 D.2560
【答案】B
17.执行以下程序段的输出结果是( )
void fun(int x)
{if(x/2>1) fun(x/2);
printf("%d",x);}
main()
{fun(7);
printf("
");getch();}
A.37 B.36 C.73 D.137
【答案】A
18.若有以下函数定义,执行调用语句:n=fun(3);,则函数fun()总共被调用的次数是( )
int fun(int k)
{if(k<1) return 0;
else if(k==1) return 1;
else return fun(k-1)+1;}
A.2 B.3 C.4 D.5
【答案】B
19.执行以下程序段的输出结果是( )
void convert(char ch)
{if(ch<'D') convert(ch+1);
printf("%c",ch);}
main()
{convert('A');
printf("
");getch();}
A.ABCDDCBA B.ABCD C.DCBA D.A
【答案】C
20.执行以下程序段的输出结果是( )
void fun(char c)
{if(c>'x') fun(c-1);
printf("%c",c);}
main()
{fun('z');
getch();}
A.xyz B.zyx C.wxyz D.zyxw
【答案】A
21.执行以下程序段的输出结果是( )
int fun(int n)
{if(n) return fun(n-1)+n;
else return 0;}
main()
{printf("%d",fun(3));getch();}
A.4 B.5 C.6 D.7
【答案】C
22.执行以下程序段的输出结果是( )
int fun(int n)
{if(n==1) return 1;
else return (n+fun(n-1));}
main()
{int x=10;
x=fun(x);
printf("%d",x);
getch();}
A.45 B.54 C.55 D.65
【答案】C
23.执行以下程序段的输出结果是( )
long fib(int n)
{if(n>2) return(fib(n-1)+fib(n-2));
else return(2);}
main()
{ printf("%ld
",fib(5));
getch();}
A.10 B.5 C.0 D.12
【答案】A
二、程序运行结果题(本题共7小题,每题3分,共21分)
24.以下程序的运行结果是( )
#include <stdio.h>
#include<conio.h>
int sum(int array[ ],int len)
{if(len==0) return array[0];
else return array[0]+sum(array+1,len-1);}
main()
{int array[5]={1,2,3,4,5};
int res=sum(array,4);
printf("%d",res);getch();}
【答案】15
25.以下程序的运行结果是( )
#include <stdio.h>
#include<conio.h>
int f(int x)
{int y;
if(x==0||x==1) return 3;
y=x*x-f(x-1);
return y;}
main()
{int z;z=f(4);
printf("%d",z);getch();}
【答案】8
26.以下程序的运行结果是( )
#include <stdio.h>
#include<conio.h>
int f(int t[ ],int n);
main()
{int a[4]={1,2,3,4},s;
s=f(a,4);
printf("%d
",s);
getch();}
int f(int t[ ],int n)
{if(n>0) return t[n-1]+f(t,n-1);
else return 0;}
【答案】10
27.以下程序的运行结果是( )
#include <stdio.h>
#include<conio.h>
int f(int a[ ],int n)
{if(n>1)
{int t;
t=f(a,n-1);
return t>a[n-1]?t:a[n-1];}
else return a[0];}
main()
{int a[ ]={8,2,9,1,3,6,4,7,5,12,13,21};
printf("%d",f(a,11));getch();}
【答案】13
28.以下程序的运行结果是( )
#include <stdio.h>
#include<conio.h>
int f(int x[ ],int n)
{if(n>1)
{f(&x[1],n-1);
printf("%d,",x[0]);}
else printf("%d,",x[0]);}
main()
{int z[6]={1,2,3,4,5,6};
f(z,6);
printf("
");getch();}
【答案】6,5,4,3,2,1,
29.以下程序的运行结果是( )
#include <stdio.h>
#include<conio.h>
main()
{ printf("%d ",fact(5));
fact(-5);getch();}
int fact(int value)
{ int f;
if(value<0)
{ printf("Arg error
");
return(-1);}
else if(value==1||value==0) f=1;
else f=value*fact(value-1)+1;
printf("%d ",f);
return f;}
【答案】1 3 10 41 206 206 Arg error
30.以下程序的运行结果是( )
#include <stdio.h>
#include<conio.h>
int f(int n)
{if(n==1) return 1;
else return f(n-1)+1;}
main()
{int i,j=0;
for(i=1;i<3;i++)
j+=f(i);
printf("%d",j);
getch();}
【答案】3
三、阅读程序,修改程序中的错误,不得增行或删行,也不得更改程序结构。请指出错误代码所在的行号,并给出该行修改后的程序代码。每处3分,共9分)
31.下列程序的功能是:使用递归函数的方法求以下多项式的值,在住函数中输入x和n的值,并输出结果。程序中一共有3处错误,请改正。
L1 #include <stdio.h>
L2 #include<conio.h>
L3 float p(int n,int x)
L4 {float f;
L5 if(n==0)
L6 f=1.0;
L7 else if(n=1)
L8 f=x;
L9 else f=((2*n-1)*x*p((n-1),x)-(n)*p((n),x))/n;
L10 return f-1;}
L11 main()
L12 {int n,x;
L13 printf("请输入n与x的值:");
L14 scanf("%d%d",&n,&x);
L15 printf("结果为:%6.2f
",p(n,x));
L16 getch();}
答案:
L7 else if(n==1)
L9 else f=((2*n-1)*x*p((n-1),x)-(n-1)*p((n-2),x))/n;
L10 return f;}
四、程序填空。按照题目要求,将正确的内容填入相应位置,使得程序完整(每空3分,共24分)
32.以下程序的功能是使用递归法求某数a的平方根,求平方根的迭代公式如下所示。请填空。
#include <math.h>
#include <stdio.h>
#include<conio.h>
double mysqrt( double a,double x0)
{ double x1,y;
x1=【1】;
if(【2】>0.00001) y=mysqrt(【3】);
else y=x1;
return 【4】;}
main( )
{double x;
printf("Enter x:");
scanf("%lf",&x);
printf("The sqrt of %f= %f
",x,mysqrt(x,1.0));
getch();}
答案:①(x0+a/x0)/2.0 ②fabs(x1-x0) ③a,x1 ④y
33.下列程序的功能是求Fibonacci序列的第n项的值。请填空。
#include <stdio.h>
#include<conio.h>
int cnt=0;
int fib(int n)
{【1】;
if(n<=2) return【2】;
else return (【3】+【4】);
}
main()
{int n,result;
printf("输入一个整数:");
scanf("%d",&n);
result=fib(n);
printf("FIB(%d)=%d
",n,result);
printf("递归次数=%d",cnt);
getch();}
答案:①cnt++ ②1 ③fib(n-1) ④fib(n-2)
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$$