递归函数,即是调用一个函数的过程中出现直接或简介的调用该函数本身.此种函数就称为递归函数
  递归函数的优点是程序简洁易懂,可读性强;缺点是需要调用大量的函数调用,消耗大量的内存和时间
  一般来说,递归由函数出口和递归体两部分组成,递归出口给出了递归终止条件,递归体给出了递归的方式.

  下面一例就是简单的递归:
求N的阶乘,即求1乘2乘3一直乘到N的乘积.
递归形式如下:
f(1)=1
f(n)=f(n-1)*n
前者就是递归的出口,后者就是递归体
程序执行过程为:求f(4)反推到f(3),再反推到f(3),接着反推到f(2),最后反推到f(1),此时遇到递归出口,计算出f(1)=1,然后依次反推.f(2)=2*f(1)=2,f(3)=3*f(2)=3*2=6,f(4)=4*f(3)=4*6=24
程序代码实现:
import javax.swing.JOptionPane;
public class N {
 static int f(int x){
  int s;
  if(x==1)
   s=1;
  else
   s=f(x-1)*x;
  return s;
 }
 public static void main(String[] args) {
  int n;
  N f=new N();
  String s=JOptionPane.showInputDialog(null,"please input n:\n");
  n=Integer.parseInt(s);
  System.out.print(N.f(n));
 }
}
下面是一个很典型的递归解决的问题,如果用其他方法编写,代码将很繁琐
汉罗塔问题:有N个大小不同的盘片放在A柱上(小的在上,大的在下),另有BC两柱.要求将这N个盘片从A搬到C上,搬动中,每次只能搬动一个盘片,而且小盘片不能放在大盘片之下
程序思想:假如要移动N个盘片,如果能先将上面的N-1个盘片从A借助C移到B上,那么再将最后那个盘片移到C上,然后在把N-1个盘片从B借助A移到C上,那么就行了
代码如下
import javax.swing.JOptionPane;
public class Hanio {
 static void nuodong(int n,char A,char B,char C){
  if(n==1)
   System.out.print("move"+n+"from"+A+"to"+C+"\n");
  else{
   nuodong(n-1,A,C,B);
   System.out.print("move"+n+"from"+A+"to"+C+"\n");
   nuodong(n-1,B,A,C);
  }
 }
 public static void main(String[] args) {
  int n;
  String s=JOptionPane.showInputDialog(null,"please input n:\n");
  n=Integer.parseInt(s);
  char A='A',B='B',C='C';
  Hanio h=new Hanio();
  Hanio.nuodong(n,A,B,C);
 }
}

下面这个斐波那契数列也是用递归实现的(摘抄自其他网站)
斐波那契数列问题:列第n项,斐波那契数列第一和第二项是1,后面每一项是前两项之和,即1、1、2、3、5、8、13
import javax.swing.JOptionPane;
public class Fibonacci
{
 int F(int n)
 {
  if(n==0)
   return 1;
  else if(n==1)
   return 1;
  else if(n>1)
   return F(n-1)+F(n-2); /*递归*/
  else
   JOptionPane.showMessageDialog(null,"方程无解!");
   return 0;
 }
 public static void main(String[] args)
 {
  int i,n,m;
  Fibonacci f=new Fibonacci();
  String s=JOptionPane.showInputDialog(null,"please input n:\n");
  n=Integer.parseInt(s);
  for(i=0;i<=n;i++)
  {
   m=f.F(i);
   System.out.println(m);
  }
 }
}