1、
int fun(int n)
{
if (n <= 1)
{
return 1;
}
else
{
return n * fun(n-1);
}
}
int res = fun(5)
答案:120
2、
int search(int start, int end, int target, int *arr)
{
if(start <= end) {
int mid = start + (end - start) / 2;
if (arr[mid] == target)
return mid;
else if (target > arr[mid])
return search(mid + 1, end, target, arr);
else if (target < arr[mid])
return search(start, mid - 1, target, arr);
}
return -1;
}
答案解析:代码为标准的二分查找,期望情况下,每次将范围n缩小一半,直到找到目标元素或者左右游标相遇,因此平均需要logN次搜索,所以时间复杂度为O(logN)
3、
int f(int x){
return ((x>0)?x*f(x-1):2)
}
int i;
i=f(f(2));
答案解析:
f(x) 当x大于0时,返回x*f(x-1),否则返回2
f(0) = 2
f(1) = 1 * f(0) = 2
f(2) = 2 * f(1) = 4
f(3) = 3 * f(2) = 12
f(4) = 4 * f(3) = 48
f(4) = f(f(2)) = 48
4、
def reserve_str(s):
if len(s) < 1:
return s
return reserve_str(s[1:]) + s[0]
print(reserve_str('abc'))
答案解析:根据程序所示,当字符串s长度小于1时,直接返回字符串本身,否则返回 reserve_str(s[1:]) + s[0],因此当输入 s='abc'时,返回 reserve_str('bc')+'a' = (reserve_str('c')+'b')+'a' = ((reserve_str('')+'c')+'b')+'a'='cba',此函数主要实现将字符串进行反转
5、递归算法x(8)需要调用几次函数x(int n)
class program
{
static void Main(string[] args)
{
int i;
i = x(8);
}
static int x(int n)
{
if (n <= 3)
return 1;
else
return x(n - 2) + x(n - 4) + 1;
}
}
答案:9
6、
def max_common_divisor(x, y):
if y == 0:
return x
return max_common_divisor(y, x % y)
print(max_common_divisor(10, 4))
答案解析:
根据题意,y=4且不等于0,则max_common_divisor(10, 4)=max_common_divisor(4, 2),此时 y=2且不等于0,则max_common_divisor(4, 2)=max_common_divisor(2,0),此时y=0,则直接返回此时的 x = 2
7、
int f(int x){
return ((x>2) ? x*f(x-1) : 3);
}
int i;
i=f(f(2));
答案解析:
首先是将x=2传入,x>2为假,返回值为3,因此f(f(2))的值为f(3),
将x=3传入,x>3为真,f(3)的值为3*f(2)=9
8、给定下列递归算法的程序段,则f(15)的返回值为()。
int f(int n)
{
if(n < 1)
return 0;
if(n <= 4)
return 1;
return f(n - 1) + f(n - 2) + f(n - 3) + f(n - 4);
}
答案解析:
本题求解的算法背景为,总共有n节台阶,每次可以走1、2、3,4阶,总共有多少种走法。但本题修改了边界条件。
即f(1)=f(2)=f(3)=f(4)=1,f(n)=f(n-1)+f(n-2)+f(n-3)+f(n-4),n>=5
递归式递推可以得到,答案为2500
9、
给定一递归算法的程序段如下(r -l>1),设n=r-l+1,则该算法的时间复杂度为()
void f(int l, int r)
{
for(int i = l; i <= r; i ++ ) a[i] ++ ;
if(l == r) return ;
int mid = (l + r) / 2;
f(l, mid);
f(mid + 1, r);
return ;
}
int main()
{
n = r - l + 1;
f(l, r);
}
答案解析:
根据题意可知n为区间长度,递归树法得,递归树最多有log n层,每层的区间长度加起来都是n(除了未满的那层)。
代码中内层for循环,每个位置 i 的贡献又都是1,深度乘以层数乘以单个位置的贡献得到时间复杂度为 O(n log n)
10、
给定下面程序段,则执行一次函数f(n)(n>0)的时间复杂度为()
int f(int n){
if(n <= 1) return 2;
else return f(n - 2) / 2;
}
答案解析:
画出递归树进行分析,树高[n/2]+1层,每层O(1),总时间复杂度为O(n)
11、
在Python3中,执行以下函数运行结果为:
def pow(n, k):
if k == 0:
return 1
elif k == 1:
return n
else:
return n * pow(n, k-1)
print(pow(2, 3))
答案解析:
此题目 pow(n, k)函数表示计算 n^k,当 k==0 时表示 n^0=1,当 k==1 时表示 n^1=n,如果 k>1时,则执行递归计算 n * pow(n, k-1),当输入的 n ==2 ,k == 3,返回结果为 2 * pow(2, 2) = 2 * 2 * pow(2, 1) = 2 * 2 * 2 = 8
12、
给定一递归算法的程序段如下(n>2),则该算法的时间复杂度为()
int f(int n)
{
if(n == 2)
return 3;
else
return f(n - 1) * 4;
}
答案解析:
使用递归算法,总共调用了n-1次,规模为 O(n) 级别
13、以下程序是用来计算两个非负数之间的最大公约数:
long long gcd(long long x, long long y) {
if (y == 0)
return x;
else
return gcd(y, x % y);
}
我们假设x,y中最大的那个数的长度为n,基本运算时间复杂度为O(1),那么该程序的时间复杂度为():
答案解析:对于gcd(a,b),假设a,b中最大的数为a,则若调用了k次,则a>=F(k+2),b>=F(k+1),F(x)为第x个斐波拉切数,而F(x)=m^x/sqrt(5),因此这题最坏时间复杂度应该为O(n),与这个数的长度成正比
14、
public class Test {
public static int count = 0;
public static void main(String[] args) {
int i;
i = x(8);
System.out.println(count);
}
public static int x(int n) {
count++;
if (n <= 3)
return 1;
else
return x(n - 2) + x(n - 4) + 1;
}
}
该程序最后输出结果是多少?
答案解析:
问题问的是x(8)调多少次x(n),而不是x(x(8)),所以答案应该是9
15、
给定下列递归算法的程序段,则输出结果为()。
int f(int a, int b, int c) {
if(c == 1) {
if(b == 1) {
if(a == 1)
return 2;
else
return f(a - 1, a - 1, a - 1) + 1;
} else
return f(a, b - 1, b - 1) + 1;
} else
return f(a, b, c - 1) + 1;
}
int main() {
int n = 50;
printf("%d", f(n, n, n));
}
答案解析:22101