递归->记忆化搜索(动规)

递归是递归调用从哪里开始的,执行最后一定要返回到这个调用的地方。
举例更好理解:(二叉树递归求所有节点的个数)
模型:
F(b)=0 若b=NULL
F(b)=F(b->lchild)+F(b->rchild)+1
算法:
Int node (BTnode){
if(b==NULL)
Return 0;
Else
Return node(b->lchind)+node(b->rchild)+1;
}
//===============================
Return node(b->lchind)+node(b->rchild)+1;
node(b->lchind) 是在一开始的左子树出去的,所以当他每一次递归,直至遇到 b==NULL 返回,最终会返回到根节点的左子树那里,也就是最初的
Return node(b->lchind)+node(b->rchild)+1;调用。
而右子树同理,最后在加上一个根节点就完成里,然后整体返回,返回的是整个二叉树的所有结点数。

我觉得二叉树中的递归用的很棒,而且指针数组用的很好。
例子:(用前序和中序构造二叉树)

BTNode * creat(char* pre,char * in, int n){
BTNode *b;   //这里 char *pre; 只是把char 数组的首
    char * p;     地址传过来了,并且用的时候可以pre++
    Int k;        这么用,代表的是pre向后取元素,pre
    If(n<=0)      指向的是数组0元素
      Return NULL;
    b=(BTNode *)malloc(sizeof(BTNode));
    b->data=* pre;
    for(p=in;p<in+n;p++)  //这里p=in是把in附给p,这样p
      If(*p==*pre)        也可以操控in数组了。in可以加
        break;           减。地址的加减
    K=p-in;      //k 是根结点在in的位置,k=3 
    b->lchild=creat(pre+1,in,k);  //递归求左子树
    b->rchild=creat(pre+k+1,p+i,n-k-1);//递归求右子树
       //子树的左子树和右子树和根结点求法一样
       //递归好用
}

续更:

对于一个递归函数,其实就是一个求解的功能,那个return,返回的就是此函数求解此问题的答案。其实递归的思想就是把大问题转化为类似的小问题,然后一步一步的向下,直到遇到终止条件,表示这个问题已经不能再化为小问题了。
对于函数,他从哪里被调用的,他就会返回到哪里,小问题和大问题的求解思路是一样的。从哪里调用的函数,最后会把答案返回到这里。
例:

#include <iostream>
using namespace std;
int chundigui(int a[],int n){
    if(n==0)
        return a[0];
    return max(a[n],chundigui(a,n-1)); //递归函数名在这里,由此分出小问题,
                  //最后一步一步导回来,再求max(a[n],chundigui(a,n-1));
}
int main(){
    int a[10]={20,2,3,4,30,6,90,8,9,1};
    cout<<chundigui(a,9);
    return 0;}

我们了解到这些后,我相信对递归已经是有一定的思考了和熟知了。接下来我们在往动态规划上拓展一些,而动态规划常用的一种方法是记忆化搜索。我们就拿斐波那契额数列作为例子:
1、用递归求斐波那契数列,一个很小的数值它的复杂度就很大了,因为它是成指数级别增长的。

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

为什么用递归求解效率会很差呢? 这里留作思考,下面会有答案。
2、动态规划(记忆化搜索)

int memo[Max];

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);
}

这样就好理解多了。
因为动态规划是解决分出的子问题中有重叠的情况,所以我们把已经求得的子问题的解先储存起来,等在后面用的时候我们直接调用就可以了。这也是为什么递归效率低的原因,递归做了很多的重复的工作,而动态规划没有。

猜你喜欢

转载自blog.csdn.net/qq_35937273/article/details/79743040