设计递归算法可以分为以下几个步骤
- 1.思考递归算法的循环过程。为什么需要递归,每次递归会产生什么结果?递归次数怎么控制?
- 2.确定函数的输入和输出。
明确算法的输入和输出的数据格式。
一般需要在函数外传一个初始数据。 - 3.函数主体设计
一般是对某些数据进行循环。
函数内一般会定义一个新的数据,用于循环产生的某种结果。而这个结果会作为新的输入传递下一次。 - 4.确定递归的终止条件。
即当函数满足某个条件时跳出递归。
一般会在函数外部,或者内部(此时初始化flag为false,并传入参数列表)定义一个flag,用于标记在函数的开头或者结尾是否进行下一次递归。并且在函数循环主体或者循环结束对满足某种条件时,设置flag等于true。
当flag等于true时,递归终止。函数不再执行,return最终结果。
当flag等于false :
说明此次递归生成的结果不是我们想要的。
此时,要:
确定递归条件
根据递归条件确定是否进行下一次递归。
如果是,则调用函数自身。并且用flag接住下一次递归的结果。并且返回这个结果。
并且需要捕捉下一次递归的返回结果。并且返回这个结果。
所以,一个可行的递归算法结构如下:
var flag = false;
recursion(xxx,xxx,flag){
var newResult = null;
for(var i=0;i<xx.length;i++){
.....
newResult = ....;
if(.......){ //终止条件
flag = true; (如果满足条件,表示可以返回最终结果,停止递归。)
}
}
if(flag){
return ..... //返回需要的结果
}else{
if(xxx){ //递归条件,可以控制递归次数。不至于无限循环。
flag = recursion(newResult,....,flag);
return flag
}else{
alert("无法找到正确结果!")
return null
}
}
}