javajava中递归方法法,求助!

&&JAVA递归算法demo实例&* 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少?&* 分析:我们要想办法找规律&*&兔子对数&* 第一个月:&1&* 第二个月:1&* 第三个月:2&* 第四个月:3&&* 第五个月:5&* 第六个月:8&* ...&*&&* 由此可见兔子对象的数据是:&*&1,1,2,3,5,8...&* 规则:&*&A:从第三项开始,每一项是前两项之和&*&B:而且说明前两项是已知的&*&&* 如何实现这个程序呢?&*&A:数组实现&*&B:变量的变化实现&*&C:递归实现&*&&* 假如相邻的两个月的兔子对数是a,b&* 第一个相邻的数据:a=1,b=1&* 第二个相邻的数据:a=1,b=2&* 第三个相邻的数据:a=2,b=3&* 第四个相邻的数据:a=3,b=5&* 看到了:下一次的a是以前的b,下一次是以前的a+bcode:public class DiGui {&& &public static void main(String[] str) {&& &&& &/*int[] arr=new int[20];&& &&& &arr[0]=1;&& &&& &arr[1]=1;&& &&& &arr[2]=arr[0]+arr[1];&& &&& &&& &&& &for (int x=2;x&arr.x++) {&& &&& &&& &arr[x]=arr[x-2]+arr[x-1];&& &&& &}&& &&& &//System.err.println(arr[19]);&& &&& &int a=1;&& &&& &int b=1;&& &&& &for(int x=0;x&18;x++){&& &&& &&& &int temp=a;&& &&& &&& &a=b;&& &&& &&& &b=temp+a;&& &&& &}&& &&& &System.err.println(b);*/&& &&& &System.out.println(fib(20));&& &}&& &private static int fib(int n) {&& &&& &if(n ==1 || n ==2){&& &&& &&& &return 1;&& &&& &}else {&& &&& &&& &return fib(n-1)+fib(n-2);&& &&& &}&& &&& &&& &}& &&}&&结果:6765!!!!!!猜你喜欢0个牛币请下载代码后再发表评论/精精精精原精精原精原精原精原相关分享原原最近下载暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级最近浏览暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级扫描二维码关注最代码为好友"/>扫描二维码关注最代码为好友更多频道内容在这里查看
爱奇艺用户将能永久保存播放记录
过滤短视频
暂无长视频(电视剧、纪录片、动漫、综艺、电影)播放记录,
使用您的微博帐号登录,即刻尊享微博用户专属服务。
使用您的QQ帐号登录,即刻尊享QQ用户专属服务。
使用您的人人帐号登录,即刻尊享人人用户专属服务。
按住视频可进行拖动
&正在加载...
请选择打赏金额:
收藏成功,可进入
查看所有收藏列表
当前浏览器仅支持手动复制代码
视频地址:
flash地址:
html代码:
通用代码:
通用代码可同时支持电脑和移动设备的分享播放
用爱奇艺APP或微信扫一扫,在手机上继续观看
当前播放时间:
一键下载至手机
限爱奇艺安卓6.0以上版本
使用微信扫一扫,扫描左侧二维码,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
设备搜寻中...
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
连接失败!
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
部安卓(Android)设备,请点击进行选择
请您在手机端下载爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
爱奇艺云推送
请您在手机端登录爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
180秒后更新
打开爱奇艺移动APP,点击“我的-扫一扫”,扫描左侧二维码进行登录
没有安装爱奇艺视频最新客户端?
30秒后自动关闭
2.java方法递归调用">2.java方法递归调用
播放量数据:快去看看谁在和你一起看视频吧~
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制
安装爱奇艺视频客户端,
马上开始为您下载本片
5秒后自动消失
&li data-elem="tabtitle" data-seq="{{seq}}"& &a href="javascript:void(0);"& &span>{{start}}-{{end}}&/span& &/a& &/li&
&li data-downloadSelect-elem="item" data-downloadSelect-selected="false" data-downloadSelect-tvid="{{tvid}}"& &a href="javascript:void(0);"&{{pd}}&/a&
选择您要下载的《
色情低俗内容
血腥暴力内容
广告或欺诈内容
侵犯了我的权力
还可以输入
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制如果要用java实现算法,一定慎用递归 - singleAnt - ITeye博客
博客分类:
递归是我们很经典的一种算法实现,可以很好的描述一个算法的原理!对于算法的描述、表现和代码结构理解上,递归都是不错的选择!
但是本文想说的是java实现一个递归算法的时候尽量不要用递归实现,而是转换成的非递归实现。
最近在实现一个比较复杂算法的时候,尝试了一下,非递归实现相比递归实现速度上能提升1/3。
以下面一个简单的例子来说:
(注:为了描述简单,所以这里只用一个简单的例子。这个例子可以用更简单的数学公式来实现,所以请大家不要过分在意。 重点是想说明递归可能带来的一些问题)
输入参数:N
输出结果: log1+log2+log3+....+logN
两种实现代码如下:
public class RecursiveTest {
* 递归实现
* @param n
public static double recursive(long n) {
if (n == 1) {
return Math.log(1);
return Math.log(n) + recursive(n - 1);
* 非递归实现
* @param n
public static double directly(long n) {
double result = 0;
for (int i = 1; i &= i++) {
result += Math.log(i);
public static void main(String[] args) {
int i = 5000000;
long test = System.nanoTime();
long start1 = System.nanoTime();
double r1 = recursive(i);
long end1 = System.nanoTime();
long start2 = System.nanoTime();
double r2 = directly(i);
long end2 = System.nanoTime();
System.out.println("recursive result:" + r1);
System.out.println("recursive time used:" + (end1 - start1));
System.out.println("non-recursive result:" + r2);
System.out.println("non-recursive time used:" + (end2 - start2));
得到运行结果如下:
recursive result:7.103E7
recursive time used:
non-recursive result:7.103E7
non-recursive time used:
可以看出递归的运行时间是非递归运行时间将近2倍。
(注:以上代码还是在-Xss200m的参数下运行的,如果栈空间不足,直接不能运行)
原因简单分析:
上图是java线程栈的结构。java将为每个线程维护一个堆栈,堆栈里将为每个方法保存一个栈帧,栈帧代表了一个方法的运行状态。 也就是我们常说的方法栈。最后一个为当前运行的栈帧。
那么每一次方法调用会涉及:
1.为新调用方法的生成一个栈帧
2.保存当前方法的栈帧状态
3.栈帧上下文切换,切换到最新的方法栈帧。
递归实现将导致在栈内存的消耗(往往需要调整Xss参数)和因为创建栈帧和切换的性能开销,最终大大的影响效率!
所以,如果你想提升你的算法效率,不要使用递归实现是一个基础原则!
另外,递归是我们用来理解算法的一个方法,当用代码来实现的时候基本都可以转换成非递归的代码实现!
论坛回复 /
(27 / 11294)
cttnbcj 写道除非疯子才一个一个算logx相加 .......
向楼上所说递归是用来简单化来表达数据处理的思想
要是不用递归试试计算 f(n)=f(n-1)+f(n-2)+f(n-3)+f(n-4)+f(n-5)
不管是用非递归或推数学公式(上面公式已经要计算一元五次方程的解了),会非常复杂
五次方程没有根式解,
手工计算5个根有点累。
计算机计算起来比较容易。
可以考虑用演化计算,选择一个比较好的算子,很快就能算出最优解
除非疯子才一个一个算logx相加 .......
向楼上所说递归是用来简单化来表达数据处理的思想
要是不用递归试试计算 f(n)=f(n-1)+f(n-2)+f(n-3)+f(n-4)+f(n-5)
不管是用非递归或推数学公式(上面公式已经要计算一元五次方程的解了),会非常复杂
你根本就不理解本帖子要说明什么! 只是想说明递归的开销!
例子不是最重要的,"除非疯子才一个一个算logx相加 ....... "这个大家都懂得,不要过分去在意这个。
kimmking 写道cttnbcj 写道除非疯子才一个一个算logx相加 .......
向楼上所说递归是用来简单化来表达数据处理的思想
要是不用递归试试计算 f(n)=f(n-1)+f(n-2)+f(n-3)+f(n-4)+f(n-5)
不管是用非递归或推数学公式(上面公式已经要计算一元五次方程的解了),会非常复杂
五次方程没有根式解,
手工计算5个根有点累。
计算机计算起来比较容易。
你确定无解?只是无代数根式解
五次方程符合Galois群理论,就可以有解。。。。(x-a)(x-b)(x-c)(x-d)(x-e)=0 a,b,c,d,e都不相等,这个五次方,你说有解吗?
& 上一页 1
浏览: 259042 次
来自: 杭州
xiyuan1025 写道你这是在linux下吗,我在linu ...
xiyuan1025 写道你这是在linux下吗,我在linu ...
找不到实现类
NICE,别的博客都是从resouce开始解读的,使我一直不理 ...
xiyuan1025 写道你这是在linux下吗,我在linu ...6609人阅读
JAVA编程(108)
java中递归函数的调用-求一个数的阶乘
不考虑溢出:一般只能算到69的阶乘……
注意:0的阶乘0!=1
任何大于1的n阶乘表示方法:
=1×2×3×……×n
或n!=n×(n-1)!
用.hk & 搜索0的阶乘,可以出来一个在线计算器,很实用哦!!
import java.util.S
public class DiGui {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(&输入一个整数:&);
Scanner scan = new Scanner(System.in);
int x = scan.nextInt();
int result = digui(x);
System.out.println(result);
//递归函数
public static int digui(int x){
return x*digui(x-1);
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1798438次
积分:14777
积分:14777
排名:第775名
原创:200篇
转载:198篇
评论:165条
(1)(1)(1)(1)(1)(2)(14)(8)(10)(21)(44)(14)(6)(17)(20)(62)(31)(11)(50)(12)(10)(7)(13)(12)(3)(10)(9)(7)java递归如何破,没写成功过。急求大神
java递归如何破没写成功过。老是死循环
这要是能成功就有鬼了~~8,9两行
楼主是想先序遍历一棵树么?
getList(lists,lists.get(i).getId()) 改成 getList(coms,lists.get(i).getId())
--- 共有 2 条评论 ---
: 那可能是comradeMapper.findComradeByPid(pid)导致的。
修改过,依然死循环

我要回帖

更多关于 java递归树方法 的文章

 

随机推荐