下列 C++ 代码用于求斐波那契数列,即第 个数为 0,第 个数为 1,从第三个数开始,依次是其前两个数之和。如果输入的值为大于 1 的正整数,该代码能实现所求。
01cin >> n; 02a = 0, b = 1; 03for (int j = 0; j < n; j++) { 04 cout << a << " "; 05 b = b + a; 06 a = b - a; 07}
模拟程序执行过程,推导输出;由已知推未知,初始化+递推公式(入门)
在数学中 表示 的阶乘,即 到 的乘积,如 。下面的 C++ 用于求 的阶乘之和,如 为 ,则是 。下面代码段补充选项后用于实现上述功能,其中不能实现阶乘和的选项是( )。
01int N; 02cin >> N; 03int tnt=0, nowNum = 1; //tnt保存求和之值,当前N的阶乘 04for (int i=1; i < N + 1; i++){ 05 ____________ // 基于上一个计算出当前数的阶乘 06 ____________ // 从1到i每个数阶乘之和 07} 08cout << tnt;
D: nowNum=nowNum+i;tnt*=nowNum。nowNum应是累乘nowNum*=i,tnt累加tnt+=nowNum
小陈种植一批农作物,第一天需要浇水一次,随后的两天(第 、第 天),每天需要浇水 次,再随后的 天(第 、第 、第 天),需要每天浇水 次,这样持续下去,随后的 天,每天需要浇水 次。请问在 天里,总共浇了多少次水( )。
(跳,需完整选项)
某一系列数据的规律是从第 个数值开始是前两个数之和。下面的代码求第 个数的值,N 限定为大于 2。( )
01int start1; // 第1个数 02int start2; // 第2个数 03int N; //求N个数的值 04int tmp; 05cin >> start1 >> start2 >> N; 06for (int i = 2; i < N; i++){ 07 tmp = start1 + start2; 08 start1 = start2; 09 start2 = tmp; 10} 11cout << start2;
正确。start1,start2初值,i=2..N-1迭代Fibonacci,start2为第N个
在数学中 N! 表示 N 的阶乘,即 1 到 N 的乘积,如 ,且 。下面的两段 C++ 代码用于求 1 到 N 的阶乘之和,如 N 为 3,则结果是 9( 的值)。选项中的说法正确的是( )。
01// 实现1 02int i,N; 03cin >> N; 04int tnt = 0, last = 1; 05for (i = 1; i < N + 1; i++){ 06 last *= i; 07 tnt += last; 08} 09cout << tnt << endl;
01// 实现2 02int i,N; 03cin >> N; 04int tnt = 0, tmp; 05for (i = 1; i < N + 1; i++){ 06 tmp = 1; 07 for (int j = 1; j < i + 1; j++) 08 tmp *= j; 09 tnt += tmp; 10} 11cout << tnt << endl;
C: 实现1用前项(累乘)效率高
数列 是以意大利数学家列昂纳多·斐波那契命名的数列,从第三个数开始,每个数是前面两项之和。如果计算该数列的第 项(其中 )fib(n),我们采用如下方法:① 令 fib(1)=fib(2)=1 ② 用循环 for i=3 to n 分别计算 f(i) ③ 输出 fib(n)。这体现了递推的编程思想。
正确。f(1)=f(2)=1 为初始条件,循环中 f(i)=f(i-1)+f(i-2) 用前面项推后面项,正是递推(迭代递推)思想。
用递归法求 n 的阶乘,时间复杂度是 。
正确。递归计算 n! 调用 n 次 factorial(每次 n 减 1),时间复杂度 O(n)。
下面 C++ 函数中采用的算法是( )。
01int fib(int n) 02{ 03 int i, f[n]={0, 1}; 04 05 for(int i=2; i<=n; i++) 06 f[i]=f[i-1]+f[i-2]; 07 08 return f[n]; 09}
A:递推。代码用数组 f 记录前两项,循环从已知 f[i-1]、f[i-2] 推出 f[i],是典型的递推(迭代递推);递归是函数自己调用自己(B 错)。
下面关于递推的说法不正确的是( )。
A:递推表现为自己调用自己——错误。自己调用自己是递归的特征;递推是从初始值出发用递推关系一步步求未知项。
函数不可以调用自己。
错。函数可以递归调用自己(C++ 支持递归),如阶乘函数 factorial(n)=n*factorial(n-1)。
一个一维数组,至少含有一个自然数 ,是一个合法的数列。可以在一维数组末尾加入一个自然数 , 不能超过一维数组末尾元素的一半,形成一个新的合法的一维数组,如果 ,那么可以有 个不同的合法数组。
正确。N=6 的合法数组:{6};{6,3}(3≤3);{6,3,1}(1≤1);{6,2}(2≤3);{6,2,1}(1≤1);{6,1}(1≤3)共 6 个。
下面代码采用递推算法来实现整数 的阶乘(),则横线上应填写( )。
01int factorial(int n) { 02 int result = 1; 03 for (int i = 2; i <= n; i++) { 04 ____________ // 在此处填入代码 05 } 06 return result; 07}
A:result = i。阶乘公式 n!=1×2×...×n,循环变量 i 从 2 到 n,累乘 result=i。
递推算法通过逐步求解当前状态和前一个或几个状态之间的关系来解决问题。
正确。递推基于「当前状态 = f(前一或前几个状态)」的关系,从初始状态开始逐步推进求解。
以下代码用递推法求斐波那契数列的第 项,时间复杂度为指数级。
01int fibonacci(int n) { 02 if (n == 0) return 0; 03 if (n == 1) return 1; 04 05 int f0 = 0; // F(0) 06 int f1 = 1; // F(1) 07 int current; 08 09 for (int i = 2; i <= n; i++) { 10 current = f0 + f1; // F(n) = F(n-1) + F(n-2) 11 f0 = f1; 12 f1 = current; 13 } 14 15 return current; 16}
错。代码用循环递推(f0,f1 累加)求斐波那契,时间复杂度 O(n),不是指数级 O(2ⁿ)。
下面代码采用递推算法来计算斐波那契数列 ,则横线上应填写( )。
01int fib(int n) { 02 if (n == 0 || n == 1) 03 return n; 04 05 int f1 = 0; 06 int f2 = 1; 07 int result = 0; 08 for (int i = 2; i <= n; i++) { 09 ____________ // 在此处填入代码 10 } 11 return result; 12}
A:result = f1 + f2; f1 = f2; f2 = result;。递推斐波那契:f(2)=f1+f2=0+1=1,然后 f1=f2=1, f2=result=1 准备下轮计算 f(3)。B 是 += 会累加错误。
递推是一种通过已知的初始值和递推公式,逐步求解目标值的算法。
正确。递推算法基于初始值(边界条件)和递推关系式,逐步求解后续值。
某算法的递推关系式为 ( 为正整数)及 ,则该算法的时间复杂度为 。
正确。T(n)=T(n-1)+n 展开得 T(n)=1+n+(n-1)+...+1 = n(n+1)/2+1 = O(n²)。
小杨正在爬楼梯,需要爬 阶才能到达楼顶。如果每次可以爬 个或 个台阶,下面代码采用递推算法来计算一共有多少种不同的方法可以爬到楼顶,则横线上应填写( )。
01int f(int n) { 02 if (n == 1 || n == 2) 03 return n; 04 05 int f1 = 1; 06 int f2 = 2; 07 int res = 0; 08 for (int i = 3; i <= n; i++) { 09 ____________ // 在此处填入代码 10 } 11 return res; 12}
B:res = f1 + f2; f1 = f2; f2 = res;。爬楼梯递推:f(n)=f(n-1)+f(n-2),res=f1+f2 计算当前项,然后 f1=f2, f2=res 为下轮准备;用 = 而非 += 避免累加错误。
以下关于递推算法基本思想的描述,正确的是( )。
B:递推算法从已知的基础情况出发,通过某种关系逐步推导出更大规模问题的解。这是递推算法的核心思想。
下述斐波那契数列计算的时间复杂度是( )。
01int fibonacci(int n) { 02 if (n == 0) return 0; 03 if (n == 1) return 1; 04 return fibonacci(n - 1) + fibonacci(n - 2); 05}
D:O(2ⁿ)。fibonacci 递归无记忆化,递归树每个节点分裂为 2 个子调用,调用次数约 2ⁿ,时间复杂度指数级。
以下程序中使用了递推方式计算阶乘(),计算结果正确。
01int factorial(int n) { 02 int res = 1; 03 for (int i = 0; i < n; ++i) { 04 res *= i; 05 } 06 return res; 07}
错。factorial 代码循环 i=0..n-1(漏掉 i=n),res*=0 会得 0,结果错(应是 1×2×...×n);且 0! 应返回 1。
小杨正在爬楼梯,需要 阶才能到达楼顶,每次可以爬 阶或 阶,求小杨有多少种不同的方法可以爬到楼顶,横线上应填写( )。
01int climbStairs(int n) { 02 if (n <= 2) return n; 03 int prev2 = 1; 04 int prev1 = 2; 05 int current = 0; 06 for (int i = 3; i <= n; ++i) { 07 ____________ // 在此处填入代码 08 09 } 10 return current; 11}
A:prev2 = prev1; prev1 = current; current = prev1 + prev2。爬楼梯 f(n)=f(n-1)+f(n-2),注意 prev1 在 current = prev1+prev2 后已被更新为新 prev1。
递推是在给定初始条件下,已知前一项(或前几项)求后一项的过程。
正确。递推定义:基于已知初始条件和前一项(或前几项)求后一项。
给定函数 climbStairs(int n) 的定义如下,则 climbStairs(5) 的返回值是( )。
01int climbStairs(int n) { 02 if(n <= 2) return n; 03 int a = 1, b = 2; 04 for(int i = 3; i <= n; i++) { 05 int temp = a + b; 06 a = b; 07 b = temp; 08 } 09 return b; 10}
B:8。climbStairs(5):f(1)=1,f(2)=2,a=1,b=2;i=3:temp=3,a=2,b=3;i=4:temp=5,a=3,b=5;i=5:temp=8,a=5,b=8,返回 b=8。
考虑用如下递推方式计算斐波那契数列,时间复杂度是 。
01int n = 10; 02int f[20]; 03f[0] = 0; 04f[1] = 1; 05for (int i = 2; i <= n; i++) 06 f[i] = f[i - 1] + f[i - 2];
正确。递推 fib 用循环从 f(0)=0,f(1)=1 累加到 f(n),共 n-1 次迭代,时间 O(n)。
关于递推算法的描述,正确的是( )。
B:递推从已知初值出发,利用递推关系逐步推出后续结果。递推定义;A 错(自己调自己是递归),C 错(递推不只用于指数问题),D 错(递推不需回溯)。
执行 climb(6) 的返回值为( )。
01int climb(int n){ 02 if(n <= 2) return n; 03 int a = 1, b = 2, c = 0; 04 for(int i = 3; i <= n; i++){ 05 c = a + b; 06 a = b; 07 b = c; 08 } 09 return c; 10}
B:13。climb(6):a=1,b=2;i=3:c=3,a=2,b=3;i=4:c=5,a=3,b=5;i=5:c=8,a=5,b=8;i=6:c=13,a=8,b=13;返回 c=13。
下面用递推方式计算斐波那契数列第 项的程序,时间复杂度是 。
01int fib(int n) { 02 if (n <= 1) return n; 03 int f0 = 0, f1 = 1, cur = 0; 04 for (int i = 2; i <= n; i++) { 05 cur = f0 + f1; 06 f0 = f1; 07 f1 = cur; 08 } 09 return cur; 10}
错。代码用循环递推(f0,f1 累加),时间复杂度 O(n),不是 O(2ⁿ)。
小杨的机器人正在能量踏板上跳跃,踏板编号为 。跳到第 块踏板的方案数满足递推式 f(n) = f(n - 1) + f(n - 2)。若 f(1) 为 1,f(2) 为 2,则运行以下代码计算 jump(5) 的结果是( )。
01int jump(int n) { 02 if (n <= 2) 03 return n; 04 int a = 1, b = 2, c = 0; 05 for (int i = 3; i <= n; i++) { 06 c = a + b; 07 a = b; 08 b = c; 09 } 10 return c; 11}
B:8。jump(5):f(1)=1,f(2)=2,a=1,b=2;i=3:c=3,a=2,b=3;i=4:c=5,a=3,b=5;i=5:c=8,a=5,b=8;返回 c=8。
递归函数在调用自身时,必须满足( ),以避免无限递归?
A:避免无限递归的充要条件是存在终止条件(base case),满足时直接返回、不再调用自身。B 的参数递减只是保证能到达终止条件的常用手段而非必须;C 返回值固定与递归终止无关。
在 C 语言中,递归的实现方式通常会占用更多的栈空间,可能导致栈溢出。
对。每次递归调用都会在栈上压入新的函数栈帧,保存参数、局部变量与返回地址,递归层数深时栈空间被耗尽即发生栈溢出,无终止条件的递归更会直接溢出。
下面 C++ 代码用于求斐波那契数列,该数列第 、 项为 ,以后各项均是前两项之和。函数 fibo() 属于( )。
01int fibo(int n) { 02 if (n <= 0) 03 return 0; 04 if (n == 1 || n == 2) 05 return 1; 06 07 int a = 1, b = 1, next; 08 for (int i = 3; i <= n; i++) { 09 next = a + b; 10 a = b; 11 b = next; 12 } 13 return next; 14}
C:迭代算法。fibo() 用 for 循环从 i=3 到 n,每次 next=a+b 后让 a=b、b=next,逐步推出第 n 项,全程未调用自身,属于迭代而非递归。
下面 C++ 代码用于求斐波那契数列,该数列第 、 项为 ,以后各项均是前两项之和。下面有关说法错误的是( )。
01int fiboA(int N) 02{ 03 if (N == 1 || N == 2) 04 return 1; 05 return fiboA(N - 1) + fiboA(N - 2); 06} 07int fiboB(int N) 08{ 09 if (N == 1 || N == 2) 10 return 1; 11 int last2 = 1, last1 = 1; 12 int nowVal = 0; 13 for (int i = 2; i < N; i++) 14 { 15 nowVal = last1 + last2; 16 last2 = last1; 17 last1 = nowVal; 18 } 19 return nowVal; 20}
C:fiboA 递归中 fiboA(N-1) 与 fiboA(N-2) 的子问题大量重复计算,规模呈指数增长,效率低;fiboB 用 last1、last2 循环递推为 O(N),代码量少不代表执行效率高。
阅读下面的 C++ 代码,执行后其输出是( )。
01int stepCount = 0; 02int fracA(int N) 03{ 04 stepCount += 1; 05 cout << stepCount << "->"; 06 int rtn = 1; 07 for (int i = 1; i <= N; i++) 08 rtn *= i; 09 return rtn; 10} 11int fracB(int N) 12{ 13 stepCount += 1; 14 cout << stepCount << "->"; 15 if (N == 1) 16 return 1; 17 return N * fracB(N - 1); 18} 19int main() 20{ 21 cout << fracA(5); 22 cout << "<====>"; 23 cout << fracB(5); 24 return 0; 25}
D:stepCount 是全局变量,fracA(5) 先输出 1-> 并返回 5!=120;fracB 从 stepCount=2 开始计数,递归 5 层依次输出 2->、3->、4->、5->、6->,回溯相乘得 120。
以下 C++ 代码能以递归方式实现斐波那契数列,该数列第 、 项为 ,以后各项均是前两项之和。
01int Fibo(int N) 02{ 03 if (N == 1 || N == 2) 04 return 1; 05 else 06 { 07 int m = fiboA(N - 1); 08 int n = fiboB(N - 2); 09 return m + n; 10 } 11}
错。Fibo 的 else 分支调用的是 fiboA(N-1) 和 fiboB(N-2),这两个函数并未定义,代码无法编译;递归实现斐波那契应调用自身 Fibo(N-1)+Fibo(N-2)。