算法--递归(4)

求n个元素的最大元问题

理解:
方法1:
n = 1时, return
n = 2时,return max
n = 3时,
m = Max(n-1)
if a[n]>m
return a[n]
else return m
方法2:
二分递归求最大值
i > n || j>n || i >j return
i = j
return a[i]
j - i =1
return max(a[i], a[j])
else
k = (i+j)/2
before = Max(i, k)
after = Max(k+1, j)
return max(before, after)

时间复杂度:
在这里插入图片描述

#include <iostream>
#include <algorithm>
#include <cstdlib>
using namespace std;

//求n个元素的全排列
//自然数拆分

//求n个元素的最大元问题

int a[1000];

int Max(int i, int j)
{
    if (i == j)
        return a[i];
    if (j - i == 1)
        return max(a[i],a[j]);
    int k = (i+j)/2;
    return max(Max(i, k), Max(k+1, j));
}


int main(void)
{
    for (int i = 0; i < 5; ++i)
    {
        a[i] = i;
    }
    cout << Max(0, 4) << endl;
}

台阶问题

在这里插入图片描述
理解:
n <1
return 0
n=1
return 1
n = 2
return 2
n>2
return jump(n-1)+jump(n-2)

#include <iostream>
#include <algorithm>
#include <cstdlib>
using namespace std;

//求n个元素的全排列
//自然数拆分

//台阶问题
/*
 * n <1
return 0
n=1
return 1
n = 2
return 2
n>2
return jump(n-1)+jump(n-2)
 */

int a[1000];

int jump(int n)
{
    if (n <= 2)
        return n;
    return jump(n-1) + jump(n-2);
}


int main(void)
{
    cout << jump(4) << endl;
}

烤汉堡问题

在这里插入图片描述
在这里插入图片描述
理解:
n 为偶数时,直接为n即可,不会浪费时间
n为奇数时,可以递归:
n = 1 return 2
n = 3 return 3
n>3 return 2 + ham(n-2)
不用递归的话,应该也可以直接n>3的情况输出n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值