相信很多人都看过盗梦空间,盗梦空间本质上就是从第一层,进入到第二层,进入到第N层,然后又从第N层,返回第N-1层,最后返回到第1层,然后醒来,这其中蕴含了一种栈的思想,后进先出,而递归,本质上,就是栈的思想。
盗梦空间的递归有四步:
1. 开头写递归终止条件 -- 当我进入第5层梦境后,我就要赶紧逃离
2. 然后写当前层的逻辑 -- (你在这一层梦境,你要做什么)
3. 进入下一层 -- 进栈,下一层梦境
4. 从上一层回到当前层后,你要做的逻辑 -- (从上一层回到这一层,你要做什么)
下面我用代码实现盗梦空间
/** 盗梦空间 -- 递归 */
public static void moveIn(int level){
// recursion terminator:递归终止条件
if (level == 6 || level == 0){
return;
}
// process logic in current level:当前逻辑
System.out.println("进入第" + level + "层梦境");
// drill down:下一层
moveIn(level+1);
// reverse the current level if need:返回当前层逻辑
System.out.println("返回第" + level + "层梦境");
}
public static void main(String[] args) {
moveIn(1);
}
结果
这样的一套模板,基本所有递归都有前三步,第四步看情况添加。
而如果我们用非递归写,怎么写呢
public static void moveIn2(int level){
while (level <= 5){
System.out.println("进入第" + level + "层梦境");
level++;
}
while (level >= 1){
System.out.println("返回第" + level + "层梦境");
level--;
}
}
非递归需要维护level这个临界值,模拟进栈和出栈的情况,而递归本质就是栈,所以,递归一般代码比非递归简洁很多