一、递归算法基本思路:
Java递归算法是基于Java语言实现的递归算法。递归算法是一种直接或者间接调用自身函数或者方法的算法。递归算法实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法表示问题的解。递归往往能给我们带来非常简洁非常直观的代码形式,从而使我们的编码大大简化,然而递归的思维确实跟我们的常规思维相逆的,通常都是从上而下的思维问题,而递归趋势从下往上的进行思维。
二、递归算法解决问题的特点:
【1】递归就是方法里调用自身。
【2】在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
【3】递归算法代码显得很简洁,但递归算法解题的运行效率较低。所以不提倡用递归设计程序。
【4】在递归调用的过程中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等,所以一般不提倡用递归算法设计程序。
【5】在做递归算法的时候,一定把握出口,也就是做递归算法必须要有一个明确的递归结束条件。这一点是非常重要的。其实这个出口就是一个条件,当满足了这个条件的时候我们就不再递归了。
三、代码示例:
public class Factorial {//this is a recursive function
int fact(int n){
if (n==1) return 1
return fact(n-1)*n
}
} public class TestFactorial {
public static void main(String[] args) {
// TODO Auto-generated method stub
Factorial factorial=new Factorial()
System.out.println("factorial(5)="+factorial.fact(5))
}
}
代码执行流程图如下:
此程序中n=5就是程序的出口。
一般递归只实现一个方向的逻辑,把两个方向的逻辑放到一方法里并不好,不容易控制,实现也很麻烦,考虑到维护时的难度请不要在实际项目中使用。搞了好一会,搞出个这样的输出2N-1行星号,中间最长的一行不重复,如果楼主希望重复中间一行,可以对代码做一点点改动。
/**
* 入口,传入N
*/
public static void printStar(int number){
printStar2(number, number, 1)
}
/**
*
* @param number 给定的N
* @param oldNumber给定的N
* @param direction递归时的方向
*/
public static void printStar2(int number,int oldNumber, int direction){
if(number==0)direction++
String s=""
int i = number
if(direction==1){
for(i<oldNumberi++){
s+="*"
}
number--
}else{
for(i<oldNumberi++){
s+="*"
}
number++
if(number>oldNumber){
return
}
}
printStar2(number,oldNumber,direction)
System.out.println(s)
}