博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
递归算法 笔记
阅读量:5305 次
发布时间:2019-06-14

本文共 2175 字,大约阅读时间需要 7 分钟。

   递归算法

在数学与计算机科学中,递归是指在函数的定义中使用函数自身的方法。

递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。

递归算法解决问题的特点:

(1) 递归就是在过程或函数里调用自身。

(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。

(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。在实际编程中尤其要注意栈溢出问题。

借助递归方法,我们可以把一个相对复杂的问题转化为一个与原问题相似的规模较小的问题来求解,递归方法只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。但在带来便捷的同时,也会有一些缺点,也即:通常用递归方法的运行效率不高。

1、 Fibonacci数列

兔子问题

有一对幼兔,幼兔1个月后长成小兔小兔1个月后长成成兔后并生下一对幼兔,问2年后有多少只兔子

 

static void Main(string[] args)        {  int time=24;            int  tuzi =Hanshu(time);            Console.WriteLine(tuzi);        }        static int  Hanshu(int n)        {            if  (n< 0) {return -1;}            if  (n==0) {return 0;}            if  (n==1) {return 1;}                        return Hanshu(n-1)+Hanshu(n-2);        }

  2 汗诺塔问题

有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:

1、每次只能移动一个圆盘;

2、大盘不能叠在小盘上面。

提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。

问:如何移?最少要移动多少次?

public static void hannoi(int n, string from, string buffer, string to)    {      if (n == 1)      {        Console.WriteLine("Move disk " + n + " from " + from + " to " + to);      }      else      {        hannoi(n - 1, from, to, buffer);        Console.WriteLine("Move disk " + n + " from " + from + " to " + to);        hannoi(n - 1, buffer, from, to);      }    }

  

计算1 -2 +3 +-4+ 5- 6 + 7 - 8 + 9的值

 

static void Main(string[] args)          {              Console.WriteLine(Process3(9) - Process3(8));             Console.ReadLine();           }          public static int Process3(int i)          {             //计算1 -2 +3 +-4+ 5- 6 + 7 - 8 + 9的值             if (i == 0) return 1;             if (i == 1) return 2;             else return Process3(i - 2) + i;         }

 

  

计算1+2+3+4+...+100的值

static void Main(string[] args)          {             Console.WriteLine(Process2(100));             Console.ReadLine();             }         public static int Process2(int i)          {             //计算1+2+3+4+...+100的值             if (i == 0) return 0;             return Process2(i - 1) + i;          }

  

 

转载于:https://www.cnblogs.com/zoubizhici/p/5436312.html

你可能感兴趣的文章
记一次centos7内核可能意外丢失(测试直接干掉)恢复方法
查看>>
软工实践作业(八)
查看>>
Range Sum Query - Immutable
查看>>
[LeetCode] Median of Two Sorted Arrays
查看>>
Hibernate操作和保存方式
查看>>
Spring boot热部署配置[转]
查看>>
模拟实现select组件功能
查看>>
阅读任务-阅读提问
查看>>
浅谈JavaScript中闭包
查看>>
NativeXml (7):添加属性
查看>>
electron-api
查看>>
android自定义圆角实线边框,圆角虚线边框,直实线,虚实线,半圆角边框
查看>>
《随机出题软件》&《随机分队软件》源码(Windows API)
查看>>
日记造词——有世无解
查看>>
nohup 同时实现记录日志和屏幕输出
查看>>
web和winform的MD5加密
查看>>
理解inode以及软硬连接,和inode磁盘爆满的解决方案以及文件权限
查看>>
P5021 赛道修建 (NOIP2018)
查看>>
cudpp库的编译和使用
查看>>
命令行web客户端与HTTP REST API调试工具
查看>>