递归函数的优点是程序简洁易懂,可读性强;缺点是需要调用大量的函数调用,消耗大量的内存和时间
一般来说,递归由函数出口和递归体两部分组成,递归出口给出了递归终止条件,递归体给出了递归的方式.
下面一例就是简单的递归:
求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);
}
}
}