201701 递归学习
一、理论
递归之所以现在还存在是因为递归可以产生无限循环体。
递归的数学模型其实就是归纳法。
归纳法适用于想解决一个问题转化为解决他的子问题,而他的子问题又变成子问题的子问题,而且我们发现这些问题其实都是一个模型,也就是说存在相同的逻辑归纳处理项。当然有一个是例外的,也就是递归结束的哪一个处理方法不适用于我们的归纳处理项,当然也不能适用,否则我们就无穷递归了。这里又引出了一个归纳终结点以及直接求解的表达式。如果运用列表来形容归纳法就是:
- 步进表达式:问题蜕变成子问题的表达式
- 结束条件:什么时候可以不再是用步进表达式
- 直接求解表达式:在结束条件下能够直接计算返回值的表达式
- 逻辑归纳项:适用于一切非适用于结束条件的子问题的处理,当然上面的步进表达式其实就是包含在这里面了。
这样其实就结束了,递归也就出来了。递归算法的一般形式:
void func( mode)
{
if(endCondition)
{
constExpression //基本项
}
else
{
accumrateExpreesion //归纳项
mode=expression //步进表达式
func(mode) //调用本身,递归
}
}
二、实践
回文是一种字符串,它正着读和反着读都是一样的。比如level,eye都是回文。用迭代的方法可以很快地判断一个字符串是否为回文。
先来看第一点,是否存在一种符合条件的分解。容易发现,如果一个字符串是回文,那么在它的内部一定存在着更小的回文。 比如level里面的eve也是回文。
一个只有一个字符的字符串一定是回文,空字符串也是回文,这样,我们就得到了回文问题的两个简单情境:字符数为1和字符数为0。

浙公网安备 33010602011771号