内容正文:
7.6与7.7节:函数的嵌套调用和递归调用
一、单项选择题
1.下列关于 C 语言函数嵌套调用的叙述,正确的是( )
A. 函数可以嵌套定义,也可以嵌套调用
B. 函数不可以嵌套定义,但可以嵌套调用
C. 函数既不能嵌套定义,也不能嵌套调用
D. 函数可以嵌套定义,但不可以嵌套调用
2.以下选项中,属于函数递归调用基本特征的是()
A. 函数内部调用其他不同名称的函数 B. 函数自身直接或间接调用自身
C. 多个函数循环互相调用无终止 D. 主函数 main 调用所有自定义函数
3.递归函数的两个必要条件是()
A. 函数必须有返回值,且参数为整型
B. 存在终止条件,且每次递归调用后更接近终止条件
C. 函数必须是全局函数,且不能调用库函数
D. 函数必须包含循环结构,且递归深度不超过10层
4.以下程序的输出结果是()
#include <stdio.h>
int add(int a, int b) { return a + b; }
int calc(int x, int y) { return add(x, y) * 2; }
main() {
int result = calc(3, 4);
printf("%d
", result);}
A. 7 B. 14 C. 12 D. 24
5.关于递归函数int fun(int n) { if(n==1) return 1; else return n * fun(n-1); },当调用fun(5)时,递归调用的次数是()
A. 3次 B. 4次 C. 5次 D. 6次
6.递归函数int fib(int n) { if(n<=2) return 1; else return fib(n-1)+fib(n-2); },fib(6)的返回值是()
A. 5 B. 8 C. 13 D. 21
7.函数int gcd(int a, int b) { return b==0 ? a : gcd(b, a%b); }的功能是()
A. 求a和b的最小公倍数 B. 求a和b的最大公约数
C. 求a和b的和 D. 求a和b的差
8.以下程序输出结果是()
#include <stdio.h>
int func(int n) {
if(n==0) return 0;
else return n + func(n-1);
}
main() {
printf("%d
", func(4));}
A. 4 B. 6 C. 10 D. 15
9.关于函数嵌套调用和递归调用的区别,正确的是()
A. 嵌套调用是函数调用自身,递归调用是函数调用其他函数
B. 嵌套调用是函数调用其他函数,递归调用是函数调用自身
C. 嵌套调用和递归调用都是函数调用自身
D. 嵌套调用和递归调用都是函数调用其他函数
10.以下程序输出结果是()
#include <stdio.h>
int func1(int x) { return x * 2; }
int func2(int x) { return func1(x) + 1; }
main() {
printf("%d
", func2(5));}
A. 5 B. 10 C. 11 D. 12
二、填空题。
1.递归函数int sum(int n) { if(n==1) return 1; else return n + sum(n-1); },sum(10)的返回值是___________。
2.函数int func(int n) { if(n<=1) return 1; else return func(n-1) * n; }的功能是___________。
3.以下程序输出结果是___________。
#include <stdio.h>
int func(int a, int b) { return a > b ? a : b; }
int max4(int w, int x, int y, int z) {
int m = func(w, x);
m = func(m, y);
m = func(m, z);
return m;}
main() {
printf("%d
", max4(10, 20, 15, 25));}
4.递归函数int func(int n) { if(n==0) return 0; else return func(n-1) + 2*n -1; },func(5)的返回值是___________。
5.函数int add(int a, int b) { return a + b; },int calc(int x) { return add(x, 5); }中,calc函数对add函数的调用属于________调用。
6.递归函数int sum(int n) { if(n==0) return 0; else return ________; },实现求1到n的和,横线处应填________。
7.函数int add(int a, int b) { return a + b; },int mul(int x) { return add(x, x) * 2; }中,mul(3)的返回值为___________。
8.递归函数int func(int n) { if(n==0) return 1; else return n * func(n-1); },func(5)的返回值为___________。
9.函数int func(int a, int b) { return a + b; },int test() { return func(2, func(3, 4)); }中,test()的返回值为___________。
10.函数int max(int a, int b) { return a > b ? a : b; },int max4(int a, int b, int c, int d) { return max(max(a,b), max(c,d)); }中,max4使用了________次max函数调用。
三、阅读程序题。
1.写出下列程序段的输出结果:________________。
#include <stdio.h>
int add(int a, int b) { return a + b; }
int calc(int x) { return add(x, 10) * 2; }
main() {
printf("%d
", calc(5));
}
2.写出下列程序段的输出结果:________________。
#include <stdio.h>
int dg(int n)
{
int s;
if(n == 3)
return 2;
s = dg(n + 1) - 3;
return s;
}
main()
{
printf("%d",dg(1));}
3.写出下列程序段的输出结果:________________。
#include <stdio.h>
void f2(int k);
void f1(int k)
{
if(k % 2 == 0)
{
printf("@");
f2(k - 1);}
}
void f2(int k)
{
printf("#");
f1(k - 1);}
main()
{ f1(4);}
4.写出下列程序段的输出结果:________________。
#include <stdio.h>
int mix(int a,int b)
{ if(a == b)
return a;
if(a > b)
return mix(a - b,b);
else
return mix(a,b - a);}
main()
{ printf("%d",mix(12,8));}
5.写出下列程序段的输出结果:________________。
#include <stdio.h>
void reverse_print(int n) {
if (n > 0) {
printf("%d", n % 10);
reverse_print(n / 10);
}
}
main() {
reverse_print(12345);}
6.写出下列程序段的输出结果:________________。
#include <stdio.h>
int ack(int m, int n) {
if (m == 0) return n + 1;
if (n == 0) return ack(m - 1, 1);
return ack(m - 1, ack(m, n - 1));
}
main() {
printf("%d
", ack(1, 1));}
7.写出下列程序段的输出结果:________________。
#include <stdio.h>
int sum_array(int arr[], int n) {
if (n <= 0) return 0;
return arr[n-1] + sum_array(arr, n-1);
}
main() {
int a[] = {10, 20, 30, 40};
printf("%d
", sum_array(a, 4));}
8.写出下列程序段的输出结果:________________。
#include <stdio.h>
int func_a(int x) { return x + 1; }
int func_b(int x) { return x * x; }
int func_c(int x) { return func_b(func_a(x)) - func_a(func_b(x)); }
main() {
printf("%d
", func_c(3));}
9.写出下列程序段的输出结果:________________。
#include <stdio.h>
int fun(int n)
{
int res;
if(n == 1)
return 1;
res = 2 * fun(n - 1) + 1;
return res;
}
main()
{ printf("%d",fun(4));}
10.写出下列程序段的输出结果:________________。
#include <stdio.h>
int rev(int n)
{
if(n < 10)
return n;
return rev(n / 10) * 2 + n % 10;
}
main()
{ printf("%d",rev(23));}
四、程序填空题(根据题意,将空缺的语句补上)
1.下列函数的功能是:计算xn。
long long power(int x, int n) {
if (n == 0) return 1;
if (n % 2 == 0) {
long long temp = power(x, n / 2);
return ____①____;
} else {
return ____②____;
}
}
2.以下程序通过递归函数实现将一个十进制整数转换成二进制数并输出。请填空。
#include <stdio.h>
void dec2bin(int n) {
if (n > 1) {
___①___;
}
printf("%d", ___②___);
}
main() {
int num;
scanf("%d", &num);
dec2bin(num);}
3.以下程序通过递归函数计算以下数列的第n项:a1=1, a2=2, an = 2a(n-1) + 3a(n-2) (n>=3)。请填空。
#include <stdio.h>
int sequence(int n) {
if (n == 1) {
return 1;
}
if (n == 2) {
return 2;
}
return ______;
}
main() {
int n;
scanf("%d", &n);
printf("%d
", sequence(n));}
4.以下程序通过递归函数计算一个整数的位数。例如,输入1234,输出4。请填空。
#include <stdio.h>
int count_digits(int n) {
if (n < 10) {
return 1;
} else {
return 1 + ______;
}
}
main() {
int num;
scanf("%d", &num);
printf("%d
", count_digits(num));}
5.以下程序通过递归函数判断一个字符串是否是回文(正读反读相同)。请填空。
#include <stdio.h>
#include <string.h>
int is_palindrome(char s[], int left, int right) {
if (left >= right) {
return 1;
}
if (s[left] != s[right]) {
return 0;
}
return is_palindrome(s, ___①___, ___②___);
}
main() {
char str[100];
scanf("%s", str);
int len = strlen(str);
if (is_palindrome(str, 0, len - 1))
printf("Yes
");
else printf("No
");
}
五、编程题。
1. 编写一个递归函数,计算以下数列的前n项和:S(n) = 1 + 1/2 + 1/3 + ... + 1/n。编写主函数测试。
示例输入: 3
示例输出: 1.833333
2.编写一个递归函数,输出一个正整数n的质因数分解结果。例如,输入12,输出2 * 2 * 3。要求按从小到大顺序输出。
示例输入: 12
示例输出: 2 * 2 * 3
3.编写一个递归函数,计算一个整数的二进制表示中1的个数。编写主函数测试。
示例输入: 7
示例输出: 3
4.编写一个递归函数,判断一个整数数组是否是升序排列。编写完整程序。
示例输入1: 5
1 2 3 4 5
示例输出1: Sorted
示例输入2: 5
1 3 2 4 5
示例输出2: Not sorted
5.编写一个递归函数,计算一个正整数n的平方根(整数部分)。要求使用二分查找法,不得使用库函数。编写完整程序。
示例输入: 10
示例输出: 3
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$
7.6与7.7节:函数的嵌套调用和递归调用
一、单项选择题
1.下列关于 C 语言函数嵌套调用的叙述,正确的是( )
A. 函数可以嵌套定义,也可以嵌套调用
B. 函数不可以嵌套定义,但可以嵌套调用
C. 函数既不能嵌套定义,也不能嵌套调用
D. 函数可以嵌套定义,但不可以嵌套调用
【答案】B
【解析】C 语言严格禁止函数嵌套定义,允许函数嵌套调用,即一个函数执行过程中调用另一个函数。
2.以下选项中,属于函数递归调用基本特征的是( )
A. 函数内部调用其他不同名称的函数 B. 函数自身直接或间接调用自身
C. 多个函数循环互相调用无终止 D. 主函数 main 调用所有自定义函数
【答案】B
【解析】递归核心定义:函数直接调用自身或通过其他函数间接调用自身。
3.递归函数的两个必要条件是( )
A. 函数必须有返回值,且参数为整型
B. 存在终止条件,且每次递归调用后更接近终止条件
C. 函数必须是全局函数,且不能调用库函数
D. 函数必须包含循环结构,且递归深度不超过10层
【答案】B
【解析】递归的两个核心条件是:存在明确的终止条件,且每次递归调用后问题规模缩小,逐步接近终止条件,否则会无限递归导致栈溢出。
4.以下程序的输出结果是( )
#include <stdio.h>
int add(int a, int b) { return a + b; }
int calc(int x, int y) { return add(x, y) * 2; }
main() {
int result = calc(3, 4);
printf("%d
", result);}
A. 7 B. 14 C. 12 D. 24
【答案】B
【解析】calc(3,4)调用add(3,4)得到7,再乘以2得到14,这是典型的函数嵌套调用。
5.关于递归函数int fun(int n) { if(n==1) return 1; else return n * fun(n-1); },当调用fun(5)时,递归调用的次数是( )
A. 3次 B. 4次 C. 5次 D. 6次
【答案】B
【解析】fun(5)调用fun(4),fun(4)调用fun(3),fun(3)调用fun(2),fun(2)调用fun(1),共4次递归调用,fun(1)为终止条件。
6.递归函数int fib(int n) { if(n<=2) return 1; else return fib(n-1)+fib(n-2); },fib(6)的返回值是( )
A. 5 B. 8 C. 13 D. 21
【答案】B
【解析】斐波那契数列:1,1,2,3,5,8,第6项为8,递归计算过程符合数列规律。
7.函数int gcd(int a, int b) { return b==0 ? a : gcd(b, a%b); }的功能是( )
A. 求a和b的最小公倍数 B. 求a和b的最大公约数
C. 求a和b的和 D. 求a和b的差
【答案】B
【解析】这是欧几里得算法的递归实现,通过gcd(b, a%b)逐步缩小问题规模,最终得到最大公约数。
8.以下程序输出结果是( )
#include <stdio.h>
int func(int n) {
if(n==0) return 0;
else return n + func(n-1);
}
main() {
printf("%d
", func(4));}
A. 4 B. 6 C. 10 D. 15
【答案】C
【解析】func(4)=4+func(3)=4+3+func(2)=4+3+2+func(1)=4+3+2+1+func(0)=10,递归求和。
9.关于函数嵌套调用和递归调用的区别,正确的是( )
A. 嵌套调用是函数调用自身,递归调用是函数调用其他函数
B. 嵌套调用是函数调用其他函数,递归调用是函数调用自身
C. 嵌套调用和递归调用都是函数调用自身
D. 嵌套调用和递归调用都是函数调用其他函数
【答案】B
【解析】嵌套调用是函数A调用函数B,递归调用是函数A调用自身,这是两者的核心区别。
10.以下程序输出结果是( )
#include <stdio.h>
int func1(int x) { return x * 2; }
int func2(int x) { return func1(x) + 1; }
main() {
printf("%d
", func2(5));}
A. 5 B. 10 C. 11 D. 12
【答案】C
【解析】func2(5)调用func1(5)得到10,再加1得到11,嵌套调用顺序执行。
二、填空题。
1.递归函数int sum(int n) { if(n==1) return 1; else return n + sum(n-1); },sum(10)的返回值是___________。
【答案】55
【解析】递归求1到10的和,1+2+...+10=55,符合等差数列求和公式。
2.函数int func(int n) { if(n<=1) return 1; else return func(n-1) * n; }的功能是___________。
【答案】求n的阶乘
【解析】func(n)=n*func(n-1),func(1)=1,符合阶乘定义n!=n*(n-1)!。
3.以下程序输出结果是___________。
#include <stdio.h>
int func(int a, int b) { return a > b ? a : b; }
int max4(int w, int x, int y, int z) {
int m = func(w, x);
m = func(m, y);
m = func(m, z);
return m;}
main() {
printf("%d
", max4(10, 20, 15, 25));}
【答案】25
【解析】max4通过多次嵌套调用func(求两数最大值),逐步比较得到四个数的最大值25。
4.递归函数int func(int n) { if(n==0) return 0; else return func(n-1) + 2*n -1; },func(5)的返回值是___________。
【答案】25
【解析】func(n)=1+3+5+...+(2n-1),即前n个奇数的和,等于n²,func(5)=25。
5.函数int add(int a, int b) { return a + b; },int calc(int x) { return add(x, 5); }中,calc函数对add函数的调用属于________调用。
【答案】嵌套
【解析】calc内部调用add,属于函数嵌套调用。
6.递归函数int sum(int n) { if(n==0) return 0; else return ________; },实现求1到n的和,横线处应填________。
【答案】n + sum(n-1)
【解析】递归求和公式为sum(n) = n + sum(n-1),终止条件sum(0)=0。
7.函数int add(int a, int b) { return a + b; },int mul(int x) { return add(x, x) * 2; }中,mul(3)的返回值为___________。
【答案】12
【解析】add(3,3)=6,6*2=12,嵌套调用计算。
8.递归函数int func(int n) { if(n==0) return 1; else return n * func(n-1); },func(5)的返回值为___________。
【答案】120
【解析】func(n)=n!,5!=120。
9.函数int func(int a, int b) { return a + b; },int test() { return func(2, func(3, 4)); }中,test()的返回值为___________。
【答案】9
【解析】func(3,4)=7,func(2,7)=9,嵌套调用参数计算。
10.函数int max(int a, int b) { return a > b ? a : b; },int max4(int a, int b, int c, int d) { return max(max(a,b), max(c,d)); }中,max4使用了________次max函数调用。
【答案】3
【解析】max(a,b)、max(c,d)、max(结果1,结果2),共3次调用。
三、阅读程序题。
1.写出下列程序段的输出结果:________________。
#include <stdio.h>
int add(int a, int b) { return a + b; }
int calc(int x) { return add(x, 10) * 2; }
main() {
printf("%d
", calc(5));
}
【答案】30
2.写出下列程序段的输出结果:________________。
#include <stdio.h>
int dg(int n)
{
int s;
if(n == 3)
return 2;
s = dg(n + 1) - 3;
return s;
}
main()
{
printf("%d",dg(1));}
【答案】-4
3.写出下列程序段的输出结果:________________。
#include <stdio.h>
void f2(int k);
void f1(int k)
{
if(k % 2 == 0)
{
printf("@");
f2(k - 1);}
}
void f2(int k)
{
printf("#");
f1(k - 1);}
main()
{ f1(4);}
【答案】@#@
4.写出下列程序段的输出结果:________________。
#include <stdio.h>
int mix(int a,int b)
{ if(a == b)
return a;
if(a > b)
return mix(a - b,b);
else
return mix(a,b - a);}
main()
{ printf("%d",mix(12,8));}
【答案】4
5.写出下列程序段的输出结果:________________。
#include <stdio.h>
void reverse_print(int n) {
if (n > 0) {
printf("%d", n % 10);
reverse_print(n / 10);
}
}
main() {
reverse_print(12345);}
【答案】54321
6.写出下列程序段的输出结果:________________。
#include <stdio.h>
int ack(int m, int n) {
if (m == 0) return n + 1;
if (n == 0) return ack(m - 1, 1);
return ack(m - 1, ack(m, n - 1));
}
main() {
printf("%d
", ack(1, 1));}
【答案】3
7.写出下列程序段的输出结果:________________。
#include <stdio.h>
int sum_array(int arr[], int n) {
if (n <= 0) return 0;
return arr[n-1] + sum_array(arr, n-1);
}
main() {
int a[] = {10, 20, 30, 40};
printf("%d
", sum_array(a, 4));}
【答案】100
8.写出下列程序段的输出结果:________________。
#include <stdio.h>
int func_a(int x) { return x + 1; }
int func_b(int x) { return x * x; }
int func_c(int x) { return func_b(func_a(x)) - func_a(func_b(x)); }
main() {
printf("%d
", func_c(3));}
【答案】6
9.写出下列程序段的输出结果:________________。
#include <stdio.h>
int fun(int n)
{
int res;
if(n == 1)
return 1;
res = 2 * fun(n - 1) + 1;
return res;
}
main()
{ printf("%d",fun(4));}
【答案】15
10.写出下列程序段的输出结果:________________。
#include <stdio.h>
int rev(int n)
{
if(n < 10)
return n;
return rev(n / 10) * 2 + n % 10;
}
main()
{ printf("%d",rev(23));}
【答案】7
四、程序填空题(根据题意,将空缺的语句补上)
1.下列函数的功能是:计算xn。
long long power(int x, int n) {
if (n == 0) return 1;
if (n % 2 == 0) {
long long temp = power(x, n / 2);
return ____①____;
} else {
return ____②____;
}
}
【答案】①temp * temp ②x * power(x, n - 1)
2.以下程序通过递归函数实现将一个十进制整数转换成二进制数并输出。请填空。
#include <stdio.h>
void dec2bin(int n) {
if (n > 1) {
___①___;
}
printf("%d", ___②___);
}
main() {
int num;
scanf("%d", &num);
dec2bin(num);}
【答案】①dec2bin(n / 2) ②n % 2
3.以下程序通过递归函数计算以下数列的第n项:a1=1, a2=2, an = 2a(n-1) + 3a(n-2) (n>=3)。请填空。
#include <stdio.h>
int sequence(int n) {
if (n == 1) {
return 1;
}
if (n == 2) {
return 2;
}
return ______;
}
main() {
int n;
scanf("%d", &n);
printf("%d
", sequence(n));}
【答案】2 * sequence(n-1) + 3 * sequence(n-2)
4.以下程序通过递归函数计算一个整数的位数。例如,输入1234,输出4。请填空。
#include <stdio.h>
int count_digits(int n) {
if (n < 10) {
return 1;
} else {
return 1 + ______;
}
}
main() {
int num;
scanf("%d", &num);
printf("%d
", count_digits(num));}
【答案】count_digits(n / 10)
5.以下程序通过递归函数判断一个字符串是否是回文(正读反读相同)。请填空。
#include <stdio.h>
#include <string.h>
int is_palindrome(char s[], int left, int right) {
if (left >= right) {
return 1;
}
if (s[left] != s[right]) {
return 0;
}
return is_palindrome(s, ___①___, ___②___);
}
main() {
char str[100];
scanf("%s", str);
int len = strlen(str);
if (is_palindrome(str, 0, len - 1))
printf("Yes
");
else printf("No
");
}
【答案】①left + 1 ②right - 1
五、编程题。
1. 编写一个递归函数,计算以下数列的前n项和:S(n) = 1 + 1/2 + 1/3 + ... + 1/n。编写主函数测试。
示例输入: 3
示例输出: 1.833333
【参考代码】
#include <stdio.h>
double sum_series(int n) {
if (n == 1) {
return 1.0;
} else {
return 1.0 / n + sum_series(n - 1);
}
}
main() {
int n;
scanf("%d", &n);
printf("%.6f
", sum_series(n));}
2.编写一个递归函数,输出一个正整数n的质因数分解结果。例如,输入12,输出2 * 2 * 3。要求按从小到大顺序输出。
示例输入: 12
示例输出: 2 * 2 * 3
【参考代码】
#include <stdio.h>
void factorize(int n, int factor) {
if (n == 1) {
return;
}
if (n % factor == 0) {
printf("%d", factor);
if (n / factor != 1) {
printf("*");
}
factorize(n / factor, factor);
} else {
factorize(n, factor + 1);
}
}
main() {
int n;
scanf("%d", &n);
factorize(n, 2);
printf("
");}
3.编写一个递归函数,计算一个整数的二进制表示中1的个数。编写主函数测试。
示例输入: 7
示例输出: 3
【参考代码】
#include <stdio.h>
int count_ones(int n) {
if (n == 0) {
return 0;
}
return (n & 1) + count_ones(n >> 1);
}
main() {
int n;
scanf("%d", &n);
printf("%d
", count_ones(n));}
4.编写一个递归函数,判断一个整数数组是否是升序排列。编写完整程序。
示例输入1: 5
1 2 3 4 5
示例输出1: Sorted
示例输入2: 5
1 3 2 4 5
示例输出2: Not sorted
【参考代码】
#include <stdio.h>
int is_sorted(int arr[], int n) {
if (n == 1) {
return 1;
}
if (arr[n-2] > arr[n-1]) {
return 0;
}
return is_sorted(arr, n-1);
}
main() {
int n;
scanf("%d", &n);
int arr[100];
for (int i = 0; i < n; i++)
scanf("%d", &arr[i]);
if (is_sorted(arr, n))
printf("Sorted
");
else
printf("Not sorted
");
}
5.编写一个递归函数,计算一个正整数n的平方根(整数部分)。要求使用二分查找法,不得使用库函数。编写完整程序。
示例输入: 10
示例输出: 3
【参考代码】
#include <stdio.h>
int sqrt_int(int n, int low, int high) {
int mid = (low + high) / 2;
if (low > high) {
return high;
}
if (mid * mid == n) {
return mid;
} else if (mid * mid < n) {
return sqrt_int(n, mid + 1, high);
} else {
return sqrt_int(n, low, mid - 1);
}
}
main() {
int n;
scanf("%d", &n);
printf("%d
", sqrt_int(n, 0, n));}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$