第31练 单元7 函数的递归调用、数组作为函数参数《C语言程序设计》(高教版第2版)一课一练
|
2份
|
7页
|
25人阅读
|
0人下载
内容正文:
编写说明:考虑到中职学生普遍基础知识相对薄弱的情况,我们依据支架式教学理念,精心编制了《C语言程序设计》(高教版第2版)一课一练。专辑里的每一份练习,都与课堂所授知识点紧密相关,题目围绕课堂所学知识点呈现。目的在于激发学生的学习兴趣,培养他们的学习自觉性,帮助学生扎实掌握课程的基本概念与基本方法,为他们后续的进一步提升奠定坚实基础。
本卷是《C语言程序设计》(高教版第2版)一课一练的单元7的第31练,内容涵盖单元7“考试系统”的模块化设计的7.2.5~7.2.6 函数的递归调用、数组作为函数参数。
《C语言程序设计》(高教版第2版)一课一练 第31练
单元7 “考试系统”的模块化设计
7.2.5~7.2.6 函数的递归调用、数组作为函数参数
1、 单项选择题(本题共5小题)
1、关于函数递归调用的必要条件,下列说法正确的是( )
A. 只需要递归条件即可正常执行
B. 只需要递归结束条件即可正常执行
C. 必须同时具备递归条件和递归结束条件
D. 不需要任何条件,可随意进行递归调用
【答案】C
【解析】递归调用必须同时满足两个条件:一是递归条件(将大问题分解为更小的同类问题),二是递归结束条件(停止递归的边界情况)。缺少任意一个条件都会导致无限递归,最终引发栈内存溢出,程序崩溃。
2、使用数组名作为函数参数时,传递的内容是( )
A. 数组所有元素的数值
B. 数组首元素的内存地址
C. 数组最后一个元素的内存地址
D. 数组元素的总个数
【答案】B
【解析】数组名本质是数组首元素的地址常量,作为函数参数时,传递的是首地址。此时形参数组与实参数组共用同一片内存空间,对形参数组的修改会直接反映到实参数组中。
3、定义接收 4 列二维数组的函数时,形参数组的声明正确的是( )
A. void func (int a [][])
B. void func (int a [4][])
C. void func (int a [][4])
D. void func (int a [5][3])
【答案】C
【解析】多维数组作为函数参数时,第一维的大小可以省略,但第二维的大小必须明确且与实参的第二维大小一致,否则编译器无法计算元素的内存地址偏移,无法正确访问数组元素。
4、下列属于函数直接递归调用的是( )
A. 函数 f1 调用 f2,f2 调用 f1
B. 函数 f 在执行过程中直接调用自身
C. 函数 f1 调用 f2,f2 调用 f3,f3 调用 f1
D. 函数 main 调用 f,f 调用 printf
【答案】B
【解析】直接递归调用指函数自身直接调用自己;选项 A、C 属于间接递归调用,选项 D 是普通的嵌套函数调用,不属于递归。
5、选择排序算法的核心逻辑是( )
A. 相邻元素两两比较,交换不符合顺序的元素
B. 每轮找到未排序部分的最小值,与未排序部分的第一个元素交换
C. 将元素依次插入已排序序列的合适位置
D. 随机交换元素直到数组有序
【答案】B
【解析】选项 A 是冒泡排序的逻辑,选项 C 是插入排序的逻辑,选项 D 是随机排序的逻辑;选择排序的核心是每轮选择未排序部分的最小值,交换到当前轮的起始位置,逐步完成排序。
2、 判断题(本题共4题)
1、递归调用可以不设置结束条件,程序会自动终止递归。( )
【答案】×
【解析】没有结束条件的递归会无限调用自身,导致栈内存被持续占用直至溢出,程序会崩溃,无法得到有效结果,必须设置明确的递归结束条件。
2、用数组元素作为函数实参时,采用值传递方式,形参的修改不会影响原数组的元素。( )
【答案】√
【解析】数组元素作为实参时,传递的是元素的数值副本,形参和实参占用独立的内存单元,形参的修改仅作用于自身,不会反馈到原数组中。
3、多维数组作为函数参数时,形参数组的第二维大小可以省略。( )
【答案】×
【解析】多维数组按行优先存储,编译器需要第二维大小计算元素的内存地址偏移,因此第二维大小必须明确声明,不能省略;而第一维大小可以省略。
4、递归求解 n 的阶乘时,递归结束条件是 n=0 或 n=1,此时返回值为 1。( )
【答案】√
【解析】根据阶乘的数学定义,0! 和 1! 的结果都是 1,这是递归的终止边界,当 n≥2 时,通过递归调用 n*(n-1)! 逐步分解问题。
3、 程序填空题(本题共1题)
1、题目描述:以下程序使用递归函数求解非负整数 n 的阶乘,主函数输入整数 n 后调用递归函数,输出计算结果,请补充缺失代码;
#include <stdio.h>
// 递归函数声明
(1)____ factorial(int n);
int main() {
int n, result;
printf("请输入一个非负整数:");
scanf("%d", &n);
if(n < 0) {
printf("输入无效,请输入非负整数!
");
return 1;
}
// 调用递归函数获取阶乘结果
result = (2)____;
printf("%d! = %d
", n, result);
return 0;
}
// 定义递归求阶乘的函数
int factorial(int n) {
// 递归结束条件:0!和1!都等于1
if(n == 0 || n == 1) {
return (3)____;
} else {
// 递归条件:n! = n * (n-1)!
return (4)____;
}
}
【答案】
(1) int
(2) factorial (n)
(3) 1
(4) n * factorial (n-1)
【解析】
(1) 递归函数返回值为整数类型,因此函数声明的返回值类型为 int,与函数定义保持一致;
(2) 调用自定义的 factorial 函数,将输入的 n 作为实参传递,获取阶乘结果并赋值给 result;
(3) 根据阶乘的数学定义,0! 和 1! 的结果为 1,这是递归的终止边界,直接返回 1 结束当前递归分支;
(4) 递归核心逻辑:当 n≥2 时,n 的阶乘等于 n 乘以 (n-1) 的阶乘,通过递归调用 factorial (n-1) 求解更小的子问题,最终逐步回溯得到完整阶乘结果。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$
编写说明:考虑到中职学生普遍基础知识相对薄弱的情况,我们依据支架式教学理念,精心编制了《C语言程序设计》(高教版第2版)一课一练。专辑里的每一份练习,都与课堂所授知识点紧密相关,题目围绕课堂所学知识点呈现。目的在于激发学生的学习兴趣,培养他们的学习自觉性,帮助学生扎实掌握课程的基本概念与基本方法,为他们后续的进一步提升奠定坚实基础。
本卷是《C语言程序设计》(高教版第2版)一课一练的单元7的第31练,内容涵盖单元7“考试系统”的模块化设计的7.2.5~7.2.6 函数的递归调用、数组作为函数参数。
《C语言程序设计》(高教版第2版)一课一练 第31练
单元7 “考试系统”的模块化设计
7.2.5~7.2.6 函数的递归调用、数组作为函数参数
1、 单项选择题(本题共5小题)
1、关于函数递归调用的必要条件,下列说法正确的是( )
A. 只需要递归条件即可正常执行
B. 只需要递归结束条件即可正常执行
C. 必须同时具备递归条件和递归结束条件
D. 不需要任何条件,可随意进行递归调用
2、使用数组名作为函数参数时,传递的内容是( )
A. 数组所有元素的数值
B. 数组首元素的内存地址
C. 数组最后一个元素的内存地址
D. 数组元素的总个数
3、定义接收 4 列二维数组的函数时,形参数组的声明正确的是( )
A. void func (int a [][])
B. void func (int a [4][])
C. void func (int a [][4])
D. void func (int a [5][3])
4、下列属于函数直接递归调用的是( )
A. 函数 f1 调用 f2,f2 调用 f1
B. 函数 f 在执行过程中直接调用自身
C. 函数 f1 调用 f2,f2 调用 f3,f3 调用 f1
D. 函数 main 调用 f,f 调用 printf
5、选择排序算法的核心逻辑是( )
A. 相邻元素两两比较,交换不符合顺序的元素
B. 每轮找到未排序部分的最小值,与未排序部分的第一个元素交换
C. 将元素依次插入已排序序列的合适位置
D. 随机交换元素直到数组有序
2、 判断题(本题共4题)
1、递归调用可以不设置结束条件,程序会自动终止递归。( )
2、用数组元素作为函数实参时,采用值传递方式,形参的修改不会影响原数组的元素。( )
3、多维数组作为函数参数时,形参数组的第二维大小可以省略。( )
4、递归求解 n 的阶乘时,递归结束条件是 n=0 或 n=1,此时返回值为 1。( )
3、 程序填空题(本题共1题)
1、题目描述:以下程序使用递归函数求解非负整数 n 的阶乘,主函数输入整数 n 后调用递归函数,输出计算结果,请补充缺失代码;
#include <stdio.h>
// 递归函数声明
(1)____ factorial(int n);
int main() {
int n, result;
printf("请输入一个非负整数:");
scanf("%d", &n);
if(n < 0) {
printf("输入无效,请输入非负整数!
");
return 1;
}
// 调用递归函数获取阶乘结果
result = (2)____;
printf("%d! = %d
", n, result);
return 0;
}
// 定义递归求阶乘的函数
int factorial(int n) {
// 递归结束条件:0!和1!都等于1
if(n == 0 || n == 1) {
return (3)____;
} else {
// 递归条件:n! = n * (n-1)!
return (4)____;
}
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$