DS:chap06递归

chap06、递归 (157/364)

1、课前秀

  • 自已调用自已,直接递归
  • 间接递归

2、递归设计方法

2.1、递归模型

  • f(1)=1 :递归的终止条件(递归出口)
  • f(n)=n*f(n-1) n > 1:递归体,给出了f(n)的值与f(n-1)的值之间的关系。

2.2、递归的执行过程

  • 把“大问题”分解为求解过程和环境都相似的“小问题”。

2.3、递归设计

  • (1)对原问题f(s)进行分析,假设出合理的“较小问题”f(s');
  • (2)假设f(s')是可解的,在此基础上确定f(s)的解,即给出f(s)与f(s')之间的关系;
  • (3)确定一个特定情况(如f(1)或f(0))的解,由此作为递归出口。

2.4、递归到非递归的转换

  • 直接求值,不需要回溯,使用中间变量保存中间结果,称为直接转换法

    • 题目:
      f(1)=1
      f(2)=1
      f(n)=f(n-1)+f(n-2) n>2
      
    • int f(int n)
      {
          int i,s;
          s1 = 1;//s1用于保存f(n-1)的值
          s2 = 1;//s2用于保存f(n-2)的值
          s = 1;
          for(i=3;i<=n;i++)
          {
              s = s1+s2;
              s2 = s1;
              s1 = s;
          }
          return (s);
      }
      
    • NULL

  • 不能直接求值,需要回溯,使用栈保存中间结果,称为间接转换法

    • //伪算法过程
      将初始状态s0进栈
      while(栈不为空)
      {
          退栈,将栈顶元素赋给s
          if(s是要找的结果)
              返回
          else
          {
              寻找到s的相关状态s1
              将s1进栈
          }
      }
      
    • //非递归方法计算一棵二叉树的所有结点个数
      #define n 100
      typedef struct node
      {
          char data;
          struct node *left,*right;
      }bltree;
      
      int counter(bltree *t)
      {
          bltree *st[n],*p;
          int top,count = 0;
          if(t!=NULL)
          {
              top = 1;
              stack[top] = t;//将根结点入栈
              while(top > 0)
              {
                  count++;//结点计数器增1
                  node = stack[top];//将栈顶结点退栈并赋给node
                  top--;
                  if(node->left != NULL)
                  {
                      top++;
                      stack[top]=node->left;
                  }
                  if(node->right != NULL)
                  {
                      top++;
                      stack[top]=node->right;
                  }
              }
          }
          return (count);
      }
      
    • NULL

ReadMe

  • 20200623看了《李春葆:数据结构习题与解析》电子版,自已的实体书还没看呢。
    • 基本能理解,但习题还没做,不知道自考真题有没有相关。
    • 递归到非递归的转换要好好理解一下,代码还没有run呢。

猜你喜欢

转载自www.cnblogs.com/fewolflion/p/13184057.html
DS