慎用递归!

其一,所有的递归实现都可以 iteratively 实现,虽然很多时候递归的代码更简洁。

其二,递归会产生多余的开销,包括空间和时间。

其三,如果一定要递归,不要在一个递归函数里做多件事,最好只做一件。

像下面的代码(未完成,因为写不下去了),试图在递归函数里做三件事,

(1) 检测路径是否存在

(2) 构造路径

(3) 处理cache

所以写到这个地步逻辑已经非常混乱了。


public boolean getPath(int x, int y, ArrayList<Point> path,
HashMap<Point, Boolean> cache){

if(!isFree(x, y)){
return false;
}

// in the code below,
// we are guaranteed point (x, y) is free

Point p = new Point(x, y);

if(x == 0 && y == 0){
path.add(p);
return true;
}

if(x >= 1 && getPath(x -1, y, path) ){
path.add(p);
return true;
}

if(y >= 1 && getPath(x, y-1, path)){
path.add(p);
return true;
}
return false;
}

慎用递归!

时间: 2024-12-29 04:21:18

慎用递归!的相关文章

Java基础学习笔记 -- 11(方法、重载、递归)

1. 方法 1)方法作用: 封装一段特定的逻辑功能 ,使程序结构清晰.便于代码的重复使用 2)方法的定义: 方法的主要三要素:方法名.参数列表.返回值. 修饰词  返回值类型  方法名( 参数列表 ) { 方法体 } 说明: ① 返回值类型: 方法需返回结果时使用,无返回值为void,有返回值时设计为特定数据类型即可 . ② 参数列表:参数的设计,使方法处理更灵活,参数根据需求是可有可无的. 3)方法的调用: 根据有无返回值或者是有无参数,以及调用情况,有以下的调用方法 ① 方法名(); ② 方

打造可高效维护代码的几个原则

来源:http://blog.csdn.net/lezhiyong 1      问题 1.1                  工程 功能越来越多,逻辑越来越复杂,模块越来越混乱.架构越来越复杂 常见问题: 1.模块A发消息给其他模块处理,B模块->转发消息给C->转发给D->转发给A 2.初始头文件功能定义清晰,越到后面里面东西越混乱. 3.各模块内重复实现基础功能. 1.2                  个人开发 1.对前人代码: 不能理解前人代码的思想,新功能自成一套体系.

Algorithms算法题&lt;1.1&gt;

1.1.27 二项分布.估计用一下代码计算binomial(100,50,0.25)将会产生的递归调用次数: 1 public static double binomial(int N,int k,double p){ 2 if(N==0 && k==0) return 1.0; 3 if(N<0 || k<0) return 0.0; 4 return (1.0-p)*binomial(N-1,k,p) + p*binomial(N-1,k-1,p); 5 } 用这段代码来计

01-Java学习笔记

本系列笔记由常彦博整理,请知悉 目  录 一. Java技术基础......................................................................................................... 1 1.1编程语言.......................................................................................................

Java代码优化总结

代码优化是一个很重要的课题.一般来说,代码优化的目标主要有两个,一个是减小代码的体积,另一个是提高代码运行的效率. 代码优化的细节有很多,此处列举部分: 1.尽量指定类.方法的final修饰符. 带有final修饰符的类是不可派生的.在Java核心API中,有许多应用final的例子,例如java.lang.String,整个类都是final的. 为类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被重写. 如果指定了一个类为final,则该类所有的方法都是f

Vue 重点 必须要记住的

基础知识: vue的生命周期: beforeCreate/created. beforeMount/mounted. beforeUpdate/updated. beforeDestory/destoryed vue常用指令: v-for. v-bind(缩写形式 :prop). v-on(缩写形式 @click='sss'). v-if/v-else/v-else-if. v-model. v-once. v-html. v-show... vue自定义组件: Vue.component('c

Vue 超快速学习

Vue 超快速学习 基础知识: 1.vue的生命周期: beforeCreate/created. beforeMount/mounted. beforeUpdate/updated. beforeDestory/destoryed 2.vue常用指令: v-for. v-bind(缩写形式 :prop). v-on(缩写形式 @click='sss'). v-if/v-else/v-else-if. v-model. v-once. v-html. v-show... 3.vue自定义组件: 

Vue基础知识点

基础知识: vue的生命周期: beforeCreate/created.beforeMount/mounted.beforeUpdate/updated.beforeDestory/destoryed vue常用指令: v-for.v-bind(缩写形式:prop).v-on(缩写形式@click='sss').v-if/v-else/v-else-if.v-model.v-once.v-html.v-show... vue自定义组件:Vue.component('componentName'

TSql CTE 递归原理探究

CTE是如何进行递归的?产生递归的条件有三个,分别是 初始值 自身调用自身 结束递归的条件 1,示例代码 ;with cte as ( select 1 as id, 1 as jd union all select id +1 as id ,jd+2 as jd from cte where id<10 ) select * from cte 查询结果如下 2,递归过程分析 2.1 初始值 select 1 as id, 1 as jd 提供初始值,CTE中的值只有这一个. 2.2 第一次递归