第38练 第7章 函数的递归调用《C语言程序设计》(电子工业出版社)一课一练
|
2份
|
7页
|
41人阅读
|
0人下载
内容正文:
编写说明:考虑到中职学生普遍基础知识相对薄弱的情况,我们依据支架式教学理念,精心编制了《C语言程序设计》(电子工业出版社)一课一练。专辑里的每一份练习,都与课堂所授知识点紧密相关,题目围绕课堂所学知识点呈现。目的在于激发学生的学习兴趣,培养他们的学习自觉性,帮助学生扎实掌握课程的基本概念与基本方法,为他们后续的进一步提升奠定坚实基础。
本卷是《C语言程序设计》(电子工业出版社)一课一练的第7章的第38练,内容涵盖第7章函数的7.7 函数的递归调用。
《C语言程序设计》(电子工业出版社)一课一练 第38练
第7章 函数
7.7 函数的递归调用
1、 单项选择题(本题共4小题)
1、关于函数递归调用的描述,正确的是( )
A. 递归调用是指一个函数调用另一个不同的函数
B. 递归函数必须包含终止条件,否则会出现无限递归
C. 递归调用的执行效率比递推法更高
D. 所有问题都适合用递归方式解决
2、递归函数的核心组成部分是( )
A. 函数体中的循环语句
B. 大量的变量定义
C. 多个不同的函数调用
D. 终止条件和自身调用语句
3、下列关于递归与递推的说法,错误的是( )
A. 递推是从初始条件出发,逐步计算出结果
B. 递归是从问题的最终状态出发,逐步分解到初始条件
C. 汉诺塔问题只能用递归算法实现,无法用递推完成
D. 递归的代码结构通常比递推更简洁
4、汉诺塔问题中,将 n(n≥2)个圆盘从 A 针移动到 C 针,递归分解的第一步是( )
A. 将 A 针上的 1 个圆盘直接移动到 C 针
B. 将 A 针上的 n-1 个圆盘借助 C 针移动到 B 针
C. 将 B 针上的 n-1 个圆盘借助 A 针移动到 C 针
D. 将 A 针上的 n 个圆盘直接移动到 C 针
2、 判断题(本题共3题)
1、递归函数可以没有终止条件,程序运行时会自动停止递归调用。( )
2、递归调用的执行过程是 "先递推分解到终止条件,再逐层返回计算结果"。( )
3、使用递归解决问题时,代码结构通常比递推法更简洁易懂。( )
3、 填空题(本题共2题)
1、函数递归调用必须满足的两个必要条件是:____和____。
2、汉诺塔问题中,当 n≥2 时,将 n 个圆盘从 A 针移动到 C 针的第三个核心步骤是:____。
4、 读程序写结果题(本题共1题)
1、阅读下面的 C 语言程序,写出程序运行后的输出结果。
【程序代码】
#include <stdio.h>
int fact(int n) {
// 递归终止条件:n=1时返回1
if(n == 1) return 1;
// 递归调用自身,分解问题
else return fact(n-1) * n;
}
int main() {
int res = fact(4);
printf("4的阶乘结果是:%d", res);
return 0;
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$
编写说明:考虑到中职学生普遍基础知识相对薄弱的情况,我们依据支架式教学理念,精心编制了《C语言程序设计》(电子工业出版社)一课一练。专辑里的每一份练习,都与课堂所授知识点紧密相关,题目围绕课堂所学知识点呈现。目的在于激发学生的学习兴趣,培养他们的学习自觉性,帮助学生扎实掌握课程的基本概念与基本方法,为他们后续的进一步提升奠定坚实基础。
本卷是《C语言程序设计》(电子工业出版社)一课一练的第7章的第38练,内容涵盖第7章函数的7.7 函数的递归调用。
《C语言程序设计》(电子工业出版社)一课一练 第38练
第7章 函数
7.7 函数的递归调用
1、 单项选择题(本题共4小题)
1、关于函数递归调用的描述,正确的是( )
A. 递归调用是指一个函数调用另一个不同的函数
B. 递归函数必须包含终止条件,否则会出现无限递归
C. 递归调用的执行效率比递推法更高
D. 所有问题都适合用递归方式解决
【答案】B
【解析】递归调用是函数自身调用自身,选项 A 错误;递归需要额外的栈空间,执行效率通常低于递推,选项 C 错误;并非所有问题都适合递归,比如简单的求和问题用递推更直观,选项 D 错误;递归必须有终止条件,否则会导致栈溢出,选项 B 正确。
2、递归函数的核心组成部分是( )
A. 函数体中的循环语句
B. 大量的变量定义
C. 多个不同的函数调用
D. 终止条件和自身调用语句
【答案】D
【解析】递归的本质是函数自身调用,同时必须有终止条件来结束递归过程,否则会无限调用下去。循环语句、多函数调用都不是递归的核心,因此选项 D 正确。
3、下列关于递归与递推的说法,错误的是( )
A. 递推是从初始条件出发,逐步计算出结果
B. 递归是从问题的最终状态出发,逐步分解到初始条件
C. 汉诺塔问题只能用递归算法实现,无法用递推完成
D. 递归的代码结构通常比递推更简洁
【答案】C
【解析】汉诺塔问题用递归实现更直观简洁,但也可以通过递推或迭代的方式实现,只是逻辑复杂度更高,并非只能用递归,选项 C 的描述错误。
4、汉诺塔问题中,将 n(n≥2)个圆盘从 A 针移动到 C 针,递归分解的第一步是( )
A. 将 A 针上的 1 个圆盘直接移动到 C 针
B. 将 A 针上的 n-1 个圆盘借助 C 针移动到 B 针
C. 将 B 针上的 n-1 个圆盘借助 A 针移动到 C 针
D. 将 A 针上的 n 个圆盘直接移动到 C 针
【答案】B
【解析】汉诺塔的递归分解逻辑为:第一步把 A 上的 n-1 个圆盘移到 B(借助 C),第二步把 A 上剩余的 1 个圆盘移到 C,第三步把 B 上的 n-1 个圆盘移到 C(借助 A),因此选项 B 正确。
2、 判断题(本题共3题)
1、递归函数可以没有终止条件,程序运行时会自动停止递归调用。( )
【答案】×
【解析】如果递归函数没有终止条件,会不断调用自身,导致栈内存溢出,程序崩溃,无法自动停止,因此该表述错误。
2、递归调用的执行过程是 "先递推分解到终止条件,再逐层返回计算结果"。( )
【答案】√
【解析】递归的执行分为递推和回溯两个阶段:递推阶段不断分解问题直到触发终止条件,回溯阶段从终止条件开始,逐层返回计算每一层的结果,该表述符合递归的执行逻辑。
3、使用递归解决问题时,代码结构通常比递推法更简洁易懂。( )
【答案】√
【解析】对于汉诺塔、阶乘等具有重复子问题的场景,递归可以用少量代码描述问题的分解逻辑,比递推法的循环结构更直观简洁,因此该表述正确。
3、 填空题(本题共2题)
1、函数递归调用必须满足的两个必要条件是:____和____。
【答案】有明确的终止条件;函数自身调用自身
【解析】终止条件用于结束递归过程,避免无限调用;自身调用是递归的核心特征,通过分解问题实现复杂功能,两者缺一不可。只有同时满足这两个条件,递归才能正常执行并得到正确结果。
2、汉诺塔问题中,当 n≥2 时,将 n 个圆盘从 A 针移动到 C 针的第三个核心步骤是:____。
【答案】把 B 针上的 n-1 个圆盘借助 A 针移动到 C 针
【解析】这是汉诺塔递归分解的最后一步,与第一步的逻辑类同,完成剩余圆盘的移动,最终实现所有圆盘从 A 到 C 的转移,符合汉诺塔的规则要求。
4、 读程序写结果题(本题共1题)
1、阅读下面的 C 语言程序,写出程序运行后的输出结果。
【程序代码】
#include <stdio.h>
int fact(int n) {
// 递归终止条件:n=1时返回1
if(n == 1) return 1;
// 递归调用自身,分解问题
else return fact(n-1) * n;
}
int main() {
int res = fact(4);
printf("4的阶乘结果是:%d", res);
return 0;
}
【答案】
程序运行结果:
4 的阶乘结果是:24
【解析】
调用fact(4)时,先递归调用fact(3)→fact(2)→fact(1),fact(1)触发终止条件返回 1;随后回溯计算:fact(2)=1*2=2,fact(3)=2*3=6,fact(4)=6*4=24,最终主函数输出结果 24。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$