挑战——搜索

一、穷竭搜索

1.递归函数

(1)阶乘的递归。

int fact(int n){
    if(n==0) return 1;
    return n*fact(n-1);
}

在递归时一定要有终止条件,此处为n==0;

(2)斐波那契数列的优化。

未优化的为:

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

由于fib(n)不会变化,可以通过开一个数组记录下前面记录的n的值来减少计算量。

优化后为:

int memo(MAXN+1);
int fib(int n){
    if(n<=1) return n;
    if(memo[n]!=0) return memo[n];
    return memo[n]=fib(n-1)+fib(n-2);
}

这种方法是出于动态规划与记忆化搜索。

2.栈

头文件为stack支持push与pop。LIFO模式last in first out,后进先出。访问队顶元素用top。

#include <cstdio>
#include <stack>
using namespace std;
int main()
{
    stack<int> s;
    s.push(1);
    s.push(2);
    s.push(3);
    printf("%d\n",s.top());
    s.pop();
    printf("%d\n",s.top());
    s.pop();
    printf("%d\n",s.top());
    s.pop();
    return 0;
}

3.队列

队列也支持pop与push操作,但是跟栈不一样,最初放入的最先取出。头文件为queue。

#include <cstdio>
#include <queue>
using namespace std;
int main()
{
    queue<int> que;
    que.push(1);
    que.push(2);
    que.push(3);
    printf("%d\n",que.front());
    que.pop();
    printf("%d\n",que.front());
    que.pop();
    printf("%d\n",que.front());
    que.pop();
    return 0;
}

4.深度优先搜索

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值