内容正文:
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《编程语言基础——C语言》(第5版)《一课一练》第22练,内容是6.6 函数应用实例(递归函数、应用综合)。
《编程语言基础——C语言》(第5版)一课一练 第22练
6.6 函数应用实例(递归函数、应用综合)
一、单选题
1. 一个函数直接或间接地调用自身,这种调用方式称为( )
A. 递归调用
B. 嵌套调用
C. 循环调用
D. 回调调用
2. 编写递归函数时,以下哪个要素是必须的( )
A. 函数必须返回void类型
B. 必须包含递归终止条件,防止无限递归
C. 递归调用次数不能超过10次
D. 递归函数不能有形参
3. 设有递归函数 int f(int n) { if(n<=1) return 1; return n * f(n-1); },调用 f(4) 的返回值是( )
A. 4
B. 10
C. 24
D. 120
4. 关于递归与循环(递推)的比较,以下说法正确的是( )
A. 递归一定比循环效率高
B. 循环无法实现递归的功能
C. 递归不需要占用额外的栈空间
D. 递归代码简洁但可能占用较多栈空间,循环效率更高但代码可能较复杂
5. 设有函数 int fib(int n) { if(n==1||n==2) return 1; return fib(n-1)+fib(n-2); },调用 fib(5) 的返回值是( )
A. 3
B. 5
C. 8
D. 13
6. 在main()中调用func1(),func1()中又调用func2(),这种调用方式称为( )
A. 递归调用
B. 循环调用
C. 函数的嵌套调用
D. 函数的并行调用
7. 以下关于C语言函数的描述中,不正确的是( )
A. C语言中允许在函数内部再定义另一个函数
B. 一个C程序可以由多个函数组成,其中有且仅有一个main()函数
C. 函数的返回值通过return语句返回给调用者
D. 被调用的函数可以是库函数,也可以是用户自定义函数
二、程序运行结果题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
int f(int n)
{
if (n <= 1)
return 1;
else
return n * f(n - 1);
}
main()
{
printf("%d
", f(5));
}
三、程序填空题
9. 以下程序的功能是:使用递归函数计算x的n次方(n≥0)。请填空。
#include <stdio.h>
int power(int x, int n)
{
if (n == 0)
return 1;
else
return 【1】;
}
main()
{
printf("%d
", power(2, 5));
}
四、阅读程序改错题
10. 阅读以下程序,该程序的功能是使用递归函数计算1+2+...+n的和。程序中有1处错误,请指出错误所在行号并修改正确,不许增删行,在原行上修改。
L1 #include <stdio.h>
L2 int sum(int n)
L3 {
L4 if (n == 1)
L5 return 1;
L6 else
L7 return n + sum(n);
L8 }
L9 main()
L10 {
L11 printf("%d
", sum(10));
L12 }
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
【编写说明】依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循“由浅入深、循序渐进”的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《编程语言基础——C语言》(第5版)《一课一练》第22练,内容是6.6 函数应用实例(递归函数、应用综合)。
《编程语言基础——C语言》(第5版)一课一练 第22练
6.6 函数应用实例(递归函数、应用综合)
一、单选题
1. 一个函数直接或间接地调用自身,这种调用方式称为( )
A. 递归调用
B. 嵌套调用
C. 循环调用
D. 回调调用
【答案】A
【解析】递归调用是指函数在执行过程中直接或间接地调用自身。递归函数通常包含两个部分:递归终止条件(不再递归的情况)和递归表达式(将问题转化为更小的同类问题)。
2. 编写递归函数时,以下哪个要素是必须的( )
A. 函数必须返回void类型
B. 必须包含递归终止条件,防止无限递归
C. 递归调用次数不能超过10次
D. 递归函数不能有形参
【答案】B
【解析】递归函数必须包含终止条件(边界条件),否则会无限递归直到栈溢出。如求n!的递归中,if(n==1||n==0) return 1; 就是终止条件。没有终止条件的递归函数是不可用的。
3. 设有递归函数 int f(int n) { if(n<=1) return 1; return n * f(n-1); },调用 f(4) 的返回值是( )
A. 4
B. 10
C. 24
D. 120
【答案】C
【解析】这是阶乘的递归实现。f(4)=4*f(3)=4*3*f(2)=4*3*2*f(1)=4*3*2*1=24。递归过程:f(4)→f(3)→f(2)→f(1)遇到终止条件返回1,逐层返回相乘。
4. 关于递归与循环(递推)的比较,以下说法正确的是( )
A. 递归一定比循环效率高
B. 循环无法实现递归的功能
C. 递归不需要占用额外的栈空间
D. 递归代码简洁但可能占用较多栈空间,循环效率更高但代码可能较复杂
【答案】D
【解析】递归与循环各有优劣:递归代码简洁清晰,易于理解,但每次递归调用都需要保存现场,占用栈空间较多;循环(递推)效率更高,不产生额外调用开销,但某些问题(如汉诺塔)用循环表达较困难。
5. 设有函数 int fib(int n) { if(n==1||n==2) return 1; return fib(n-1)+fib(n-2); },调用 fib(5) 的返回值是( )
A. 3
B. 5
C. 8
D. 13
【答案】B
【解析】这是斐波那契数列的递归实现。fib(5)=fib(4)+fib(3)=[fib(3)+fib(2)]+[fib(2)+fib(1)]=...按递推计算,F(1)=1,F(2)=1,F(3)=2,F(4)=3,F(5)=5。
6. 在main()中调用func1(),func1()中又调用func2(),这种调用方式称为( )
A. 递归调用
B. 循环调用
C. 函数的嵌套调用
D. 函数的并行调用
【答案】C
【解析】在一个函数中调用另一个函数称为函数的嵌套调用。C语言中函数定义是平行的(不能嵌套定义),但函数调用可以嵌套(一层调一层)。递归调用是嵌套调用的特殊形式(函数调用自身)。
7. 以下关于C语言函数的描述中,不正确的是( )
A. C语言中允许在函数内部再定义另一个函数
B. 一个C程序可以由多个函数组成,其中有且仅有一个main()函数
C. 函数的返回值通过return语句返回给调用者
D. 被调用的函数可以是库函数,也可以是用户自定义函数
【答案】A
【解析】C语言不允许在函数内部定义另一个函数(即函数定义不能嵌套),所有函数的定义都是平行的。但函数调用可以嵌套。一个C程序由若干函数组成,必须有且只有一个main()作为程序入口。
二、程序运行结果题
8. 以下程序的运行结果是【··】。
#include <stdio.h>
int f(int n)
{
if (n <= 1)
return 1;
else
return n * f(n - 1);
}
main()
{
printf("%d
", f(5));
}
【答案】120
【解析】f(n)是阶乘的递归函数。f(5)=5*f(4)=5*4*f(3)=5*4*3*f(2)=5*4*3*2*f(1)=5*4*3*2*1=120。当n<=1时递归终止返回1,然后逐层返回相乘。
三、程序填空题
9. 以下程序的功能是:使用递归函数计算x的n次方(n≥0)。请填空。
#include <stdio.h>
int power(int x, int n)
{
if (n == 0)
return 1;
else
return 【1】;
}
main()
{
printf("%d
", power(2, 5));
}
【答案】【1】x * power(x, n - 1)
【解析】递归计算x^n:当n=0时返回1(任何数的0次方为1),否则返回x * power(x, n-1),即x * x^(n-1) = x^n。如power(2,5)=2*power(2,4)=...2^5=32。
四、阅读程序改错题
10. 阅读以下程序,该程序的功能是使用递归函数计算1+2+...+n的和。程序中有1处错误,请指出错误所在行号并修改正确,不许增删行,在原行上修改。
L1 #include <stdio.h>
L2 int sum(int n)
L3 {
L4 if (n == 1)
L5 return 1;
L6 else
L7 return n + sum(n);
L8 }
L9 main()
L10 {
L11 printf("%d
", sum(10));
L12 }
【答案】【1】L7: return n + sum(n); → 修改为 return n + sum(n - 1);(递归调用时参数必须递减逼近终止条件,否则造成无限递归)
【解析】递归函数中,递归调用的参数必须向终止条件靠近。原程序sum(n)调用自身时参数n不变,导致无限递归直到栈溢出。修改为sum(n-1)后,每次递归n递减,最终n==1时终止,正确计算1+2+...+n的和。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$