递归算法

来源:互联网 发布:java汉化版 编辑:程序博客网 时间:2024/05/01 21:02

                                                                              递归算法

定义

总结:

   1、循环调用自己

   2、函数结束临界条件  

经典例子

例一:乘法阶乘

     求n! 

递归算法实现如下:

   int JieChengRecursive(int n)        {            int sum = 1;            if (n >= 2)            {                sum = n * JieChengRecursive(n - 1);            }            else            {                return 1;            }            return sum;        }

例二:汉诺塔

     有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:
     每次只能移动一个圆盘;
    大盘不能叠在小盘上面。
    提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。
    问:如何移?最少要移动多少次?

      最早发明这个问题的人是法国数学家爱德华·卢卡斯。

    传说印度某间寺院有三根柱子,上串64个金盘。寺院里的僧侣依照一个古老的预言,以上述规则移动这些盘子;预言说当这些盘子移动完毕,世界就会灭亡。这个传说叫做梵天寺之塔问题(Tower of Brahma puzzle)。但不知道是卢卡斯自创的这个传说,还是他受他人启发。
若传说属实,僧侣们需要264 ? 1步才能完成这个任务;若他们每秒可完成一个盘子的移动,就需要5849亿年才能完成。整个宇宙现在也不过137亿年。
这个传说有若干变体:寺院换成修道院、僧侣换成修士等等。寺院的地点众说纷纭,其中一说是位于越南的河内,所以被命名为“河内塔”。另外亦有“金盘是创世时所造”、“僧侣们每天移动一盘”之类的背景设定。
佛教中确实有“浮屠”(塔)这种建筑;有些浮屠亦遵守上述规则而建。“河内塔”一名可能是由中南半岛在殖民时期传入欧洲的。

 /// <summary>        /// 汉诺塔算法        /// </summary>        /// <param name="n">盘数</param>        /// <param name="from">源盘位置</param>        /// <param name="buffer">中间位置</param>        /// <param name="to">目为位置</param>        static void hannoi(int n, char from, char buffer, char to)        {            if (n==1)            {                Console.WriteLine("Move Disk:{0},from,{1},to,{2}",n,from,to);            }            else            {                hannoi(n - 1, from, to, buffer);                Console.WriteLine("Move Disk:{0},from,{1},to,{2}", n, from, to);                hannoi(n - 1, buffer, from, to);            }        }

例三:斐波那契数列

    斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …
    特别指出:第0项是0,第1项是第一个1。这个数列从第二项开始,每一项都等于前两项之和。
    
斐波那契数列递归法实现:

  int Fib(int n)        {            if (n < 1)            {                return -1;            }            if (n == 1 || n == 2)            {                return 1;            }            return Fib(n - 1) + Fib(n - 2);        }

例四:二叉树遍历

例五:字符串全排列

例六:八皇后问题  















0 0
原创粉丝点击