13-咸鱼学Java-递归与斐波拉契,汉诺塔

13人阅读 评论(0) 收藏 举报
分类:

递归简介

详细规则等,见递归简论
递归简而言之即为自己调用自己。

最不适合递归之斐波拉契

递归解法

public static int fabonic(int n)
{   
    if(n==1||n==2)
        return 1;
    else
        return fabonic(n-1)+fabonic(n-2);

}

非递归解法

public static int fabonic1(int n)
{
    int f1 =1,f2=1;
    int f3 = 0;
    for (int i = 2; i < n; i++) {
        f3 = f1+f2;
        f1 = f2;
        f2 = f3;
    }
    return f3;
}

递归算法看起来简洁,比非递归短好多,可是在计算机中递归方法需要的时间,花费的空间却是非递归的好多倍
同样求斐波拉契的第40个数

102334155
非递归0
102334155
递归305

明显可以看出非递归在计算机中运行不到1ms,递归确将近305ms。

怎么也搬不完的汉诺塔

/**
 * 移动
 * @param p1 从
 * @param p2 到
 */
public static void move(char p1,char p2)
{
    System.out.println(p1+"------->"+p2);
}
/**
 * 
 * @param n  移动盘子数
 * @param p1 从
 * @param p2 借助
 * @param p3 到
 */
public static void hanoi(int n,char p1,char p2,char p3)
{
    if(n==1)
    {
        move(p1,p3);                //当只有一个盘子只需要从1 - 3
    }
    else            
    {
        hanoi(n-1, p1, p3, p2);     //需要把n-1个盘子先移动到2
        move(p1,p3);                //然后把一个盘子从1移动到3
        hanoi(n-1, p2, p1, p3);     //再把n-1个盘子移动到从2移动到3
    }
}

这里写图片描述
由以上动图就可以看出来,汉诺塔的移动主要分为3个部分,先把n-1个盘子移动到2,再把最后一个盘子从1移动到3,再把剩余的n-1个盘子从2移动到3。

查看评论

递归(斐波那契数列、汉诺塔)

斐波那契数列: #include using namespace std; int factorial(int n) { if (n == 1) { return 1; } retur...
  • lionpku
  • lionpku
  • 2015-03-18 19:13:17
  • 658

通过汉诺塔问题理解递归的精髓

汉诺塔问题介绍: 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片...
  • ken_learn
  • ken_learn
  • 2014-05-01 13:56:35
  • 1553

递归思想解决汉诺塔的问题

【解决思路】  以3个塔柱为例     铁柱x  铁柱y  铁柱z 总共64个盘子    我们把所有的呃思路聚集为以下两个问题:  问题1: 将X上的63个盘子借助z移动到y上  ...
  • huanghuanghonghong
  • huanghuanghonghong
  • 2016-10-14 23:12:35
  • 432

汉诺塔问题以及递归

汉诺塔问题我最初接触汉诺塔问题大概是在高三的时候,那个时候的数学试卷出了这么一道题目,记得当初觉得这道题目很有趣,自己翻前覆后想了很多,但是终究还是没有想出个所以然来,或许在那个时候,这道题目在老师和...
  • lishuhuakai
  • lishuhuakai
  • 2015-10-01 23:54:48
  • 886

Python学习笔记 递归-斐波那契数列,汉诺塔

#设置python允许的最大递归次数(默认是100) import sys sys.setrecursionlimit(1000)#求阶乘 def factorial(n): if n == ...
  • u013218907
  • u013218907
  • 2015-04-04 07:22:23
  • 898

递归和迭代算法 [汉诺塔问题]

递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己. 一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大...
  • luobo140716
  • luobo140716
  • 2016-05-24 13:40:41
  • 3220

(优秀汉诺塔算法)对汉诺塔经典递归问题的理解与讲解(部分引用大神代码,附链接。)

博客大神的优秀汉诺塔代码:喜欢特别冷的冬天下着雪   (侵权联系) 本文只是在大神思路的基础上加以理解。 [cpp] view plain copy  print? ...
  • Fighting_Potato
  • Fighting_Potato
  • 2016-10-10 17:55:52
  • 1261

递归经典案例汉诺塔 python实现

最近在廖雪峰大神的教程学习python  学到递归的时候有个汉诺塔的练习,汉诺塔应该是学习计算机递归算法的经典入门案例了,所以本人觉得可以写篇博客来表达一下自己的见解。这markdown编辑器还不怎...
  • hikobe8
  • hikobe8
  • 2016-01-07 22:53:02
  • 29101

汉诺塔 经典递归算法 in python

#coding:utf-8#coding:utf-8 #汉诺塔问题 n = int(input("输入初始化时A塔上盘子的个数n:\n")) def move( n , A , B ,C ): if...
  • u014496330
  • u014496330
  • 2015-03-25 14:00:56
  • 3549

用Python递归实现汉诺塔问题

问题描述汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序...
  • qq_20976745
  • qq_20976745
  • 2016-07-07 20:24:38
  • 861
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 4736
    积分: 690
    排名: 7万+
    博客专栏
    文章存档
    最新评论