对递归方法的见解
来源:互联网 发布:linux性能监控命令 编辑:程序博客网 时间:2024/04/27 18:16
递归是在算法处理中,最常用的一种方法,也是一种比较经典的处理算
法的方法。
递归是一种方法调用其自身的方法。这种调用的过程被称作递归
(recursion),但是有时候递归很难处理,而有时却很方便实用,如果编程
中没有设定可以终止递归的条件检测,它会无限制的进行递归调用,因此在
用递归时要格外小心。
递归一般可以代替循环语句使用,有些情况下使用循环比较好,而有些
时候使用递归更有效,递归方法方法虽然使程序结构优美,但其执行效率却
没有循环语句高。
这个是一个利用递归和循环同时实现阶乘的代码,当你输入的数字逐渐增
大时,就会感动递归执行的越来越慢。
import java.util.Scanner;
public class recursion
{
public static void main(String [] args)
{
Scanner input = new Scanner (System.in);
System.out.println("Please input other number: ");
int n = input.nextInt();
System.out.println("Factorial of" + n + "is" + factorial(n));
Scanner input2 = new Scanner(System.in);
System.out.println("Please input another number: ");
int m = input2.nextInt();
System.out.println("method of" + m + "is" + method(m));
}
public static long factorial(int n) //递归方法实现,
{
if (n==0)
return 1;
else
return n * factorial(n-1);
}
public static long method(int m) //循环方法实现
{
long sum ;
for(sum=1;m>1;m--)
sum *=m;
return sum;
}
}
数学中实现阶乘的思想是: 0!=1
n! = n*(n-1)* ...*2*1=n*(n-1)!;n>0
在这儿可以看出0!=1,是递归的终止条件。
而n*(n-1)! 是递归的核心数学思想。
用java实现的代码是,
if (n==0)
return 1;
else
return n * factorial(n-1);
}
注意在递归中有一种特殊的用法,就是在递归方法自身内,直接调用自
己定义的这个方法,最典型的例子就是汉诺塔问题。
实现代码如下:
import java.util.Scanner;
public class FacTest
{
static long l=0;
public static void main(String args[]) {
System.out.println("请输入盘子个数:");
Scanner s=new Scanner(System.in);
int n=s.nextInt();
System.out.println("汉诺塔层数为" + n);
System.out.println("移动方案为:" );
hanoi(n, 'a', 'b', 'c');
System.out.println("需要移动次数:"+l);
}
static void hanoi(int n, char a, char b, char c)
{
if (n ==1 )
System.out.println("需要移动次数:"+l);
else
{
hanoi(n - 1, a, c, b);
move(a, b);
hanoi(n - 1, c, b, a);
l++;
}
}
static void move(char x, char y)
{
System.out.println(x + "->" + y + "\t");
}
}
这个例子一直反复的自身调用。
由上面两个例子可以看出,最简单的递归方式是把递归语句放在函数结尾即
恰在return语句之前,这种是形式称作尾递归。
递归虽然在一些算法处理中,很方便,但是递归还是有一定的缺点,最大
的缺点就是递归算法会很快耗尽计算机的内存资源。
斐波拉切也是一个递归的经典为题;
在这个代码中:
public static long Fibonacci(int n)
{
if(n>2)
return Fibonacci(n-1)*Fibonacci(n-2);
else
return 1;
}
在这个实现代码中,使用了双重递归(double recursion),也就是说,方
法本身进行了两次调用,这样就会导致占用大量的内存。假设Fibonacci
(40).第一级递归会创建变量n,接着它两次调用,因为在第三级调用中需要
四个变量n,这是变量总数为7,因为每级调用需要的变量数是上一级的2倍,
所以这个变量个数是以指数的规律增长。因此,这样就会占用大量的内存。
- 对递归方法的见解
- 黑马程序员----对递归问题我的一点见解
- 对爱情的见解
- 对智能手机的见解
- 对枚举的见解
- 对Python的见解
- 对于递归新的见解~~~
- Android对ViewGroup中OnMeasure方法的一些个人见解
- 对工作流的一种见解
- 对jstl的一点见解
- 对面试的一点见解
- 对IT行业的见解
- 对网络管理的见解
- 个人对RunLoop的见解
- 对ArrayLi的个人见解
- 方法递归对性能的影响
- 构造方法的个人见解
- 我对网页设计的一点见解!
- sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分钟搞定sort
- 中技毕业生入IT行之困惑
- 大数加法——DLUT热身赛题解
- Fun shadow effects using custom CALayer shadowPaths
- C语言实现文件复制
- 对递归方法的见解
- ext.panel设置背景图片以及页面居中
- 表单验证插件
- HDU 1027
- SQL 各种数据类型所占字节数
- 大四学生的纠结
- 用QtCreator创建TE6410开发板的界面程序
- Queryunload事件与Unload事件的区别
- plist文件读取并动画