201701 递归学习

一、理论

  递归之所以现在还存在是因为递归可以产生无限循环体。

  递归的数学模型其实就是归纳法。

  归纳法适用于想解决一个问题转化为解决他的子问题,而他的子问题又变成子问题的子问题,而且我们发现这些问题其实都是一个模型,也就是说存在相同的逻辑归纳处理项。当然有一个是例外的,也就是递归结束的哪一个处理方法不适用于我们的归纳处理项,当然也不能适用,否则我们就无穷递归了。这里又引出了一个归纳终结点以及直接求解的表达式。如果运用列表来形容归纳法就是:

  • 步进表达式:问题蜕变成子问题的表达式
  • 结束条件:什么时候可以不再是用步进表达式
  • 直接求解表达式:在结束条件下能够直接计算返回值的表达式
  • 逻辑归纳项:适用于一切非适用于结束条件的子问题的处理,当然上面的步进表达式其实就是包含在这里面了。

这样其实就结束了,递归也就出来了。递归算法的一般形式:

  void func( mode)

  {

      if(endCondition)

      {

          constExpression         //基本项

      }

      else

      {

          accumrateExpreesion     //归纳项

          mode=expression         //步进表达式

              func(mode)          //调用本身,递归

      }

  }

 

二、实践

  回文是一种字符串,它正着读和反着读都是一样的。比如level,eye都是回文。用迭代的方法可以很快地判断一个字符串是否为回文。

  先来看第一点,是否存在一种符合条件的分解。容易发现,如果一个字符串是回文,那么在它的内部一定存在着更小的回文。 比如level里面的eve也是回文。

  一个只有一个字符的字符串一定是回文,空字符串也是回文,这样,我们就得到了回文问题的两个简单情境:字符数为1和字符数为0。

 

posted @ 2017-04-12 16:05  spliu  阅读(93)  评论(0)    收藏  举报