zoukankan      html  css  js  c++  java
  • 【算法系列】之递归算法

    1  概述

     本篇文章主要分享算法部分——递归算法,本文简要讲解几个经典的递归算个发,即乘法阶乘、汉诺塔和斐波那契数列。

    2  讲解部分

    2.1  乘法阶乘

    问题:求n!

    分析:

    0!=1;

    n!=nx(n-1)!

    code:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace ConseDemo
     8 {
     9     class Program
    10     {
    11         static void Main(string[] args)
    12         {
    13            string inputParm=Console.ReadLine();//从控制台输入参数
    14            int n = Int32.Parse(inputParm);
    15             Console.WriteLine(JieChengRecursive(n));
    16             Console.Read();
    17         }
    18 
    19         /// <summary>
    20         /// 求n!
    21         /// </summary>
    22         /// <param name="n">传入的参数n</param>
    23         /// <returns>返回阶乘n的结果</returns>
    24        public static  int JieChengRecursive(int n)
    25         {
    26             int sum = 1;
    27             if (n >= 2)
    28             {
    29                 sum = n * JieChengRecursive(n - 1);
    30             }
    31             else
    32             {
    33                 return 1;
    34             }
    35             return sum;
    36         }
    37     }
    38 }

     

    2.2  汉诺塔

    问题:有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘,大盘不能叠在小盘上面

       
        提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。
        问:如何移?最少要移动多少次?

     1      static void hannoi(int n, char from, char buffer, char to)
     2         {
     3             if (n == 1)
     4             {
     5                 Console.WriteLine("Move Disk:{0},from,{1},to,{2}", n, from, to);
     6             }
     7             else
     8             {
     9                 hannoi(n - 1, from, to, buffer);
    10                 Console.WriteLine("Move Disk:{0},from,{1},to,{2}", n, from, to);
    11                 hannoi(n - 1, buffer, from, to);
    12             }
    13         }

    科普: 

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

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

    2.3  斐波那契数列

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

    分析:

    f(0)=0;

    f(1)=1;

    f(n)=f(n-1)+f(n-2);

    code:

     1 int Fib(int n)
     2         {
     3             if (n < 1)
     4             {
     5                 return 0;
     6             }
     7             if (n == 1 || n == 2)
     8             {
     9                 return 1;
    10             }
    11             return Fib(n - 1) + Fib(n - 2);
    12         }

    2.4  总结

     关于递归算法,注意两个条件:(1)循环调用函数    (2)函数结束临界条件

    3   版权

     

    • 感谢您的阅读,若有不足之处,欢迎指教,共同学习、共同进步。
    • 博主网址:http://www.cnblogs.com/wangjiming/。
    • 极少部分文章利用读书、参考、引用、抄袭、复制和粘贴等多种方式整合而成的,大部分为原创。
    • 如您喜欢,麻烦推荐一下;如您有新想法,欢迎提出,邮箱:2016177728@qq.com。
    • 可以转载该博客,但必须著名博客来源。
  • 相关阅读:
    StratifiedKFold和KFold的区别(几种常见的交叉验证)
    剑指offer:用栈来建立队列
    剑指offer:斐波那契数列
    树状数组 gcd 查询 Different GCD Subarray Query
    Loadrunner的使用
    Loadrunner的使用
    MySQL Windows 环境安装
    RobotFrameWork 自动化环境搭建(基于 python3.6)
    MySQL Linux 环境安装
    【读书笔记】状态模式代码C#
  • 原文地址:https://www.cnblogs.com/wangjiming/p/7203669.html
Copyright © 2011-2022 走看看