第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)____; } } 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $

资源预览图

第31练 单元7 函数的递归调用、数组作为函数参数《C语言程序设计》(高教版第2版)一课一练-第1页
1

由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。