递归算法题

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

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值