有关递归算法的小例子

程序调用自身的编程技巧称为递归( recursion)。
一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。用递归思想写出的程序往往十分简洁易懂。
一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。 
注意: 
(1) 递归就是在过程或函数里调用自身; 
(2) 在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口,否则将无限进行下去(死锁)。

递归算法一般用于解决三类问题:
(1)数据的定义是按递归定义的。(Fibonacci函数)
(2)问题解法按递归算法实现。(回溯)
(3)数据的结构形式是按递归定义的。(树的遍历图的搜索)

递归的缺点:
递归算法解题的运行效率较低。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。

例一

1、  古典问题——有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第三年每个月的兔子总数为多少?(提示:兔子的规律为数列1,1,2,3,5,8,13,21....)

代码:

class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            Console.WriteLine(p.tuzi(7));
        }
        public int tuzi(int n) 
        {
            if (n == 1 || n == 2)
            {
                return 1;
            }
            else 
            {
                return tuzi(n - 1) + tuzi(n - 2);
            }

}
    }

例二

2、  趣味问题——年龄。有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?用递归算法实现。

代码:

class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
           
            Console.WriteLine( p.age(5));
        }

/// <summary>
        /// 递归法求岁数
        /// </summary>
        /// <param name="n">有几个人</param>
        /// <returns></returns>
       int age(int n)
      {
          int c;

if(n==1)
             return 10;
     
         else
          {
             c = age(n-1)+2;
              return c;
          }   
      }

例三

3、  趣味问题——猴子吃桃。海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?

代码:

class Program
    {
        static void Main(string[] args)
        {
            
            Program p = new Program();
            
            Console.WriteLine(  p.PeachNumber(5));
         
        }
        /// <summary>
        /// 递归法求桃子数
        /// </summary>
        /// <param name="n"></param>
        /// <returns></returns>
        int PeachNumber(int n) 
        {
            if (n == 1)
            {
                //最后一个是至少是六个
                return 6;
            }
            else 
            {
                return (PeachNumber(n - 1) + 1) * 5;
            }
        }

例四

汉诺塔问题。汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。用C#编写一个程序,实现输出三个圆盘的汉诺塔移动步骤

static void Main(string[] args)
        {
            int li_disk_total;

System.Console.Write("Please input disk total:");
            int.TryParse(System.Console.ReadLine(),out li_disk_total);
            hanoi(li_disk_total, ‘a‘, ‘b‘, ‘c‘);
            System.Console.WriteLine("Move success");
            System.Console.ReadLine();
        }

public static void hanoi(int n,char a,char b,char c)
        {
            if (n == 1)
                move(n, a, c);
            else
            {
                hanoi(n - 1, a, c, b);
                move(n, a, c);
                hanoi(n - 1, b, a, c);
            }
        }

public static void move(int n,char x,char y)
        {
            System.Console.WriteLine("Disk " + n.ToString() + " from " + x + " move to " + y);

}

时间: 2024-08-08 01:27:54

有关递归算法的小例子的相关文章

laravel 数据库操作小例子

public function demo() { $res = null; //insert数据插入 //$user=array('username'=>'joy','password'=>'123456','age'=>23); //$res = DB::table('users')->insert($user); /* 数据查询 $res = DB::table('users')->where('username','joy')->get(); $res = DB:

spring小例子-springMVC+mybits整合的小例子

这段时间没更博,找房去了...   吐槽一下,自如太坑了...承诺的三年不涨房租,结果今年一看北京房租都在涨也跟着涨了... 而且自如太贵了,租不起了.. 突然有点理解女生找对象要房了..   搬家太受罪了... 今天更一下springMVC整合mybits形成最简单的网站demo. 大概效果就是这样的:左边是数据库查询结果,右边是页面访问结果: 首先,一个简单的springMVC小例子可以看这个http://www.cnblogs.com/xuejupo/p/5236448.html 这是在这

cmake 之一个小例子

cmake,比手写makefile更好的选择 安装cmake,此部分略过 一.新建一个工程 这里我是在windows下使用eclipse新建了一个c工程(PS:我一般新建一个Makefile类型的工程,这样比较干净) 二.建立必要的文件夹 我的工程目录: D:\code\cpp\cmakestudy\test>tree /f 卷 软件 的文件夹 PATH 列表 卷序列号为 0006-17B7 D:. │ .cproject │ .project │ CMakeLists.txt │ ├─bin

简述人脸特异性识别&amp;&amp;一个基于LBP和SVM的人脸识别小例子

原谅我用图片,MAC在Safari里给文章进行图文排版太麻烦啦~ 本文适合初入计算机视觉和模式识别方向的同学们观看~ 文章写得匆忙,加上博主所知甚少,有不妥和勘误请指出并多多包涵. 本文Demo的代码由HZK编写,特征点由月神和YK选择和训练. 转载请注明 copyleft by sciencefans, 2014 为了方便大家学习,附上高维LBP的核心代码 1 ################################################### 2 # 3 # 4 # NO

COM2 --- 小例子

在COM1 的小例子中,,我们大概知道什么是组件类 ,什么是接口了.这小节呢,我们来实现一下由一个组件类去实现两个接口的过程. 新建项目: 我们的 解决方案的 名字是 ComDemoCode ,项目名字是 MathToolKit  这表示 我们的 项目 自动 生成的 DLL  的名字就是 MathToolKit(数学工具包). 我们的继承关系 有必要 给大家 先 列出来,让大家 看看 在这里面,IPrimerMath接口 提供 + - * / % 五个基本运算方法,IAdvanceMath接口提

python try小例子

#!/usr/bin/python import telnetlib import socket try: tn=telnetlib.Telnet('10.67.21.29',60000) except socket.error, e: print e exit(1) tn.set_debuglevel(1) tn.write('quit'+'\n') print 'ok' socket.error为错误类型 e为对象 python try小例子,布布扣,bubuko.com

C/C++ New与Delete (小例子)

转自:http://blog.csdn.net/chenzujie/article/details/7011639 先来看两段小程序: 1). #include <iostream.h> #include <String.h> void main(void) { char *str1 = "just have fun"; char *str2 = "happy day"; char *sTmpPtr = new char[255]; char

一个php多态性的小例子

多态性在 OO 中指 "语言具有以不同方式处理不同类型对象的能力",但 PHP 是弱类型语言,在这一点上就比较弱,仅有 instance of 可以用于判断对象的类型 多态性的优点:让代码更接近生活中的真实情况 一下是一个非常简单的多态性例子,描述在电脑上安装不同操作系统,linux, OS X, windows 和 computer 是两种不同类型的对象. interface os{ function name(); function creator(); } class linux

用两个小例子来解释单例模式中的“双重锁定”

学习单例模式时,好多人都不太理解双重锁定.学完后突然想到一个很有趣的例子. 单例模式结构图: 代码: Singleton类 class Singleton { private static Singleton instance; private static readonly object syncRoot = new object(); //程序运行时创建一个静态只读的进程辅助对象 private Singleton() { } //用private修饰构造方法,防止外界利用new创建此类实例