一、递归
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
1、递归实现
/**求一个数的阶乘*/
int f(int num){
if(num==1||num==0){
return 1;
}else{
return num*f(num-1);
}
}
/**累加求和*/
int f(int num){
if(num==1){
return 1;
}else{
return num+f(num-1);
}
}
/**斐波那契数列*/
int f(int num){
if(num==1||num==2){
return 1;
}else{
return f(num-1)+f(num-2);
}
}
/*把一个十进制数转换为二进制*/
static void f1(int num){
if(num==0){
return;
}else{
f1(num/2);
}
System.out.print(num%2);
}
2、迭代实现
累加、累乘略
/*斐波那契数列*/
int f2(int num){
if(num==1||num==2){
return 1;
}
int n1=1,n2=1;
int target=0;
for(int i=0;i<num-2;i++){
target=n1+n2;
n1=n2;
n2=target;
}
return target;
}
/**一个十进制数转换为二进制*/
void f(int num){
ArrayList a=new ArrayList();
int n=0;
while(num!=0){
n=num%2;
a.add(n);
num=num/2;
}
for(int i=a.size()-1;i>=0;i--){
System.out.print(a.get(i));
}
}
四、递归和迭代比较
递归其实是方便了程序员难为了机器,递归的优点是可以使代码更简洁清晰,可读性好,且可以解决少数迭代解决不了的困难问题;缺点是递归有大量函数调用(产生额外时间开销)和栈内存的开辟(占用大量栈内存),对嵌套层数深的一些算法,递归会力不从心,空间上会以内存崩溃而告终.
迭代虽然效率高,运行时间只因循环次数增加而增加,没什么额外开销,空间上也没有什么增加,但缺点就是不容易理解,编写复杂问题时困难。所以所有的迭代可以转换为递归,但递归不一定可以转换为迭代.
非递归函数虽然效率高,但却比较难编程,而且相对来说可读性差。
现代程序设计的目标主要是可读性好。随着计算机硬件性能的不断提高,程序在更多的场合优先考虑可读而不是高效,所以,鼓励用递归函数实现程序思想。