#6100. gesp五级真题分类五:递归与迭代
gesp五级真题分类五:递归与迭代
递归与迭代(共 15 题)
单选题
- 关于递归函数调用,下列说法错误的是( )。
{{ select(1) }}
- 递归调用层次过深时,可能会耗尽栈空间导致栈溢出
- 尾递归函数可以通过编译器优化来避免栈溢出
- 所有递归函数都可以通过循环结构来改写,从而避免栈溢出
- 栈溢出发生时,程序会抛出异常并可以继续执行后续代码
- 下面 C++ 代码用于求斐波那契数列,该数列第 1、2 项为 1,以后各项均是前两项之和。下面有关说法错误的是( )。
{{ select(2) }}int fiboA(int N) { if (N == 1 || N == 2) return 1; return fiboA(N-1) + fiboA(N-2); } int fiboB(int N) { if (N == 1 || N == 2) return 1; int last2 = 1, last1 = 1, nowVal = 0; for (int i = 2; i < N; i++) { nowVal = last1 + last2; last2 = last1; last1 = nowVal; } return nowVal; }
- fiboA() 用递归方式,fiboB() 循环方式
- fiboA() 更加符合斐波那契数列的数学定义,直观易于理解,而 fiboB() 需要将数学定义转换为计算机程序实现
- fiboA() 不仅仅更加符合数学定义,直观易于理解,且因代码量较少执行效率更高
- fiboB() 虽然代码量有所增加,但其执行效率更高
- 下面的 C++ 代码片段用于计算阶乘。请在横线处填入( ),实现正确的阶乘计算。
{{ select(3) }}int factorial(int n) { if (n == 0 || n == 1) { return 1; } else { __________________ } }
- return n * factorial(n-1);
- return factorial(n-1) / n;
- return n * factorial(n);
- return factorial(n/2) * factorial(n/2);
- 递归函数在调用自身时,必须满足( ),以避免无限递归。
{{ select(4) }}
- 有终止条件
- 函数参数递减(或递增)
- 函数返回值固定
- 以上都对
- 给定如下函数:
则当 n = 7 时,函数返回值为( )。int fun(int n) { if (n == 1) return 1; if (n == 2) return 2; return fun(n-2) - fun(n-1); }
{{ select(5) }}
- 0
- 1
- 21
- -11
- 给定如下函数(函数功能同上题,增加输出打印):
则当 n = 4 时,屏幕上输出序列为( )。int fun(int n) { cout << n << " "; if (n == 1) return 1; if (n == 2) return 2; return fun(n-2) - fun(n-1); }
{{ select(6) }}
- 4321
- 1234
- 42312
- 42321
- 下面给出了阶乘计算的两种方式。以下说法正确的是( )。
{{ select(7) }}int factorial1(int n) { if (n <= 1) return 1; return n * factorial1(n-1); } int factorial2(int n) { int acc = 1; while (n > 1) { acc = n * acc; n = n - 1; } return acc; }
- 上面两种实现方式的时间复杂度相同,都为 O(n)
- 上面两种实现方式的空间复杂度相同,都为 O(n)
- 上面两种实现方式的空间复杂度相同,都为 O(1)
- 函数 factorial1() 的时间复杂度为 O(2^n),函数 factorial2() 的时间复杂度为 O(n)
- 当 n = 7 时,下面函数的返回值为( )。
{{ select(8) }}int fun(int n) { if (n == 1) return 1; else if (n >= 5) return n * fun(n-2); else return n * fun(n-1); }
- 105
- 840
- 210
- 420
- 对下面两个函数,说法错误的是( )。
{{ select(9) }}int factorialA(int n) { if (n <= 1) return 1; return n * factorialA(n-1); } int factorialB(int n) { if (n <= 1) return 1; int res = 1; for(int i=2; i<=n; i++) res *= i; return res; }
- 两个函数的实现的功能相同。
- 两个函数的时间复杂度均为 O(n)。
- factorialA 采用递归方式。
- factorialB 采用递归方式。
- 下面代码用于求斐波那契数列,该数列第 1、2 项为 1,以后各项均是前两项之和。函数 fibo() 属于( )。
{{ select(10) }}int fibo(int n) { if (n <= 0) return 0; if (n == 1 || n == 2) return 1; int a = 1, b = 1, next; for (int i = 3; i <= n; i++) { next = a + b; a = b; b = next; } return next; }
- 枚举算法
- 贪心算法
- 迭代算法
- 递归算法
判断题
- 任何递归程序都可以改写为等价的非递归程序,但改写后的非递归程序一定需要显式地使用栈来模拟递归调用过程。
{{ select(11) }}
- 正确
- 错误
- 递归函数每次调用自身时,系统都会为新开启的函数分配内存,以存储局部变量、调用地址和其他信息等,导致递归通常比迭代更加耗费内存空间。
{{ select(12) }}
- 正确
- 错误
- 递归算法必须有一个明确的结束条件,否则会导致无限递归并可能引发栈溢出。
{{ select(13) }}
- 正确
- 错误
- 递归函数必须具有一个终止条件,以防止无限递归。
{{ select(14) }}
- 正确
- 错误
- 在 C++ 语言中,递归的实现方式通常会占用更多的栈空间,可能导致栈溢出。
{{ select(15) }}
- 正确
- 错误