程序调用自身的编程技巧称为递归( 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;

            }

        }

最新文章

  1. win10本地搭建apache+php+mysql运行环境
  2. GOLDENGATE 配置文档,各类参数--转发
  3. android自定义控件(4)-自定义水波纹效果
  4. 夺命雷公狗---DEDECMS----5快速入门之商城快速搭建实现快递方式和支付方式的显示
  5. 在汇编代码中调用C函数
  6. USACO Section 3.1: Stamps
  7. HTML字符实体(Character Entities),转义字符串(Escape Sequence)【转】
  8. Android:实现仿 美团/淘宝 多级分类菜单效果
  9. ThreadLocal 线程本地变量 及 源码分析
  10. 自己动手编译Android(LineageOS)源码
  11. Git初始配置和基本使用
  12. Linux tee的花式用法和pee
  13. wap2app(九)-- 使用mui.previewImage之后,页面a链接不能跳转
  14. Django 获取访问者信息
  15. 【托业】【新东方全真模拟】03~04-----P5~6
  16. 快速幂的求解-java方法(int范围之内)
  17. 根据wsdl文件,soupUI生成webservice客户端代码
  18. This problem will occur when running in 64 bit mode with the 32 bit Oracle client components installed(在64位模式下运行安装了32位的Oracle客户端组件时,会发生此问题)
  19. php 传递赋值和地址赋值 &amp;
  20. linux下查看doc在线帮助文件

热门文章

  1. 一键将Web应用发布到云-Azure Web App
  2. javaweb利用filter拦截请求
  3. SQL语言-----数据操作
  4. Chrome浏览器扩展开发系列之十七:扩展中可用的chrome.events API
  5. 优化js脚本设计,防止浏览器假死
  6. lvs讲解
  7. JPush简单Java服务端案例实现
  8. easyui点击搜索的时候获取不要文本框里面的值的问题
  9. Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂)
  10. 如何清除img图片下面有一片空白