递归算法因为写起来简单,所以一直给我一种高大上,而且很难掌握的感觉。但是仔细想过之后,发现其中还是有一些规律的。
先来举几个例子。
第一个例子是回文数组的判断,原理很简单,只要不断地判断数组的第一个与第n个,第二个与第n-1个,以此类推就可以得到结果。
所以正确的逻辑是(只表达逻辑,先不考虑语法对错)
boolean isHuiWen(Array array)
{
if (array.length <=1)
{
return true;
}else if (firstElement == LastElement)
{
return isHuiWen(array.subArray(secondElement,lastButOneElement));
} else {
return false;
}
}
第二个例子是求二叉树的深度的问题
int depthOfTree:(Root root)
{
if (root == undefined) return 0;
return 1 + Max(depthOfTree( root.left),depthOfTree(root.right));
}
分析以上两个例子中相似的地方,那就是把问题处理成不断地去做同一件事情,只是每次做这件事情的时候都需要进行参数的改变,而参数本身和最开始传入的参数是属于一个类型的子参数。所谓子参数也就是可以通过主参数的某个方法进行获取到得参数。
以此类推的话,可以想象一下,所有需要重复进行一个操作而且每次操作的参数都是主参数的同类子参数的话,那么就可以用递归函数来表示。
递归函数本质上来说是一个循环,知识把跳出条件放到了函数体内,而函数体本身就像一个循环一样。所有递归能解的问题,循环都可以,但是并不是所有循环可以解决的问题,递归都可以,要注意递归的限制条件是不断地重复一个逻辑。而且是有参数的。
暂时先想到这么多,等以后发现问题或者有更深入的思考再做修改。