数据结构之递归

定义:一个函数直接或间接调用自己

递归需要满足的三个条件:

  1.递归必须有一个明确的中止条件

  2.该函数所处理的数据规模必须在递减

  3.这个转化必须是可解的

循环和递归:

  递归:

    易于理解

    速度慢,存储空间大

  循环:

    不易理解

    速度快,存储空间小

举例:

1.求阶乘

  这一个所知道的信息就是  n! = n * (n-1)!;

  这个时候,我们可以让程序不停的调用这个方法以便达到这种所谓的结果。

  

 1 #include <stdio.h>
 2 long sum(long n);
 3 long sum(long n){
 4     long kk = 1;
 5     if(n ==1){
 6         return kk;
 7     }else{
 8         kk = n * sum(n-1);
 9         return kk;
10     }
11 }
12 int main(void){
13     printf("fff   %l\n",sum(32));
14     return 0;
15
16 }

//在程序中需要注意的是:C语言里面没有比较明确的规定long和int的字节数,所以如果大于字节范围就会出现变成零的可能性.

2.1+2+3+..+100 的和

  PS:这里就不再贴代码与上面概念一致

  

   函数的调用:

      当在一个函数的运行期间调用另一个函数时,在运行被调函数之前,系统需要完成三件事:

        1).将所有的实际参数,返回地址等信息传递给被调函数保存。

         2).为被调函数的局部变量(也包括形参)分配存储空间

        3).将控制转移到被调函数的入口

      从被调函数返回主调函数之前,系统也要完成三件事:

        1).保存被调函数的报错结果

        2).释放被调函数所占的存储空间

        3).依照被调函数保存的返回地址将控制转义到调用函数。

3.汉诺塔

  汉诺塔最主要的就是三个步骤:

    1)将n-1个盘子从A经C移到B

    2)将n从A直接移到C

    3)将n-1个盘子从B经A移到C

    

 1 #include <stdio.h>
 2
 3 void hannuota(int n,char A,char B,char C){
 4
 5     if(1 == n){
 6         printf("将编号为%d的盘子从%c移到%c\n",n,A,C);
 7     }else{
 8
 9         hannuota(n-1,A,C,B);
10         printf("将编号为%d的盘子从%c移到%c\n",n,A,C);
11         hannuota(n-1,B,A,C);
12     }
13     return;
14 }
15
16
17 int main(void){
18
19     int n;
20     char ch1 = ‘A‘;
21     char ch2 = ‘B‘;
22     char ch3 = ‘C‘;
23     printf("请输入A柱子上面原始有的盘子个数!");
24     scanf("%d",&n);
25     printf("\n");
26     hannuota(n,ch1,ch2,ch3);
27
28     return 0;
29 }

4.走迷宫

递归的应用

1.树和森林就是以递归的方式定义的

  2.数和图的很多算法就是递归实现的

  3.很多数学公式就是以递归的方式定义的

    例如:斐波拉基序列:1 1 2 3 5 ...

  

时间: 2024-08-11 10:47:40

数据结构之递归的相关文章

数据结构入门——递归

数据结构是学习编程路上的重要一步,也为以后学习算法打下基础,数据结构又称算法与数据结构,与算法密不可分,是计算机软件专业的核心课程,其重要性不言而喻. 递归分为递推与回归两个过程,递归的优点是容易理解,方便编程,可以解决很多问题,缺点是需要不断的调用递归,时间效率慢,空间占用大. 递归示例: # include <stdio.h> int f(int n) { //printf("1"); n = f(n); return n; //return f(n); //递归,必须

c语言数据结构:递归的替代-------回溯算法

1.要理解回溯就必须清楚递归的定义和过程. 递归算法的非递归形式可采用回溯算法.主要考虑的问题在于: 怎样算完整的一轮操作. 执行的操作过程中怎样保存当前的状态以确保以后回溯访问. 怎样返回至上一次未执行的操作. 2.贴代码表现: 先序遍历二叉树: BTNode *FindNode(BTNode *b,ElementType x) { //在二叉树中查找值为x的结点 BTNode *p; if (b==NULL) return NULL; else if (b->Element==x) retu

数据结构之递归案例一

什么是递归? 顾名思义,所谓递归就是一个函数(或方法)自己调用自己,最简的如下: public void text() { text(); } 就是这么简单,但是一定要给这个递归函数一个出口,不然就会无限循环下去,最后的结果就是OutOfMemory(内存溢出),如果是在main函数中调用的话,就会出现栈空间已满的错误. 如何给一个递归的方法写一个出口呢? 只要在递归的过程中,有一个方法有一条return 语句,也就是有一个递归方法不再进行递归就会退出了. 我们给上方法添加一个返回的条件; pr

《C算法.第1卷,基础、数据结构、排序和搜索(第三版)》pdf

下载地址:网盘下载 内容简介  · · · · · · <C算法>介绍了当今最重要的算法,共分3卷,<C算法(第1卷):基础.数据结构.排序和摸索>是第1卷.第1卷分4部分.共16章.第一部分"基础知识"(第1-2章)介绍了基本算法分析原理.第二部分"数据结构"(第3-5章)讲解算法分析中必须掌握的数据结构知识.主要包括基本数据结构.抽象数据结构.递归和树.第三部分"排序"(第6-11章)按章节顺序分别讨论了基本排序方法(

数据结构基础知识

数据结构之链表 数据结构之栈和队列 数据结构之二叉树 数据结构之排序 数据结构之递归

数据结构的一些复习点

数据结构知识点总结 概论 1:数据的结构直接影响算法的选择和效率. 2:数据->数据元素(元素,结点,记录)数据的基本单位->数据项(字段,域)数据不可分割的最小单位 3:数据类型:原子数据类型:值不可分(整型,字符型,实型)和结构数据类型:值可分解(数组类型,结构类型)用户自己定义的 4:数据结构:逻辑结构,物理结构:存储结构(数据结构在计算机中的表示),运算特征. 逻辑结构:集合,线性结构(一对一),树型结构(一对多),图状结构(多对多) 运算:插入,删除,查找,排序. 数据结构定义:按某

算法设计方法:递归的内涵与经典应用

摘要: 大师 L. Peter Deutsch 说过:To Iterate is Human, to Recurse, Divine.中文译为:人理解迭代,神理解递归.毋庸置疑地,递归确实是一个奇妙的思维方式.对一些简单的递归问题,我们总是惊叹于递归描述问题的能力和编写代码的简洁,但要想真正领悟递归的精髓.灵活地运用递归思想来解决问题却并不是一件容易的事情.本文剖析了递归的思想内涵,分析了递归与循环的联系与区别,给出了递归的应用场景和一些典型应用,并利用递归和非递归的方式解决了包括阶乘.斐波那契

算法--递归策略

本文地址:http://www.cnblogs.com/archimedes/p/algorithm-recursion.html,转载请注明源地址. 递归的概念与基本思想 一个函数.过程.概念或数学结构,如果在其定义或说明内部又直接或间接地出现有其本身的引用,则称它们是递归的或者是递归定义的.在程序设计中,过程或函数直接或者间接调用自己,就被称为递归调用. 递归的实现方法 递归是借助于一个递归工作栈来实现:递归=递推+回归: 递推:问题向一极推进,这一过程叫做递推:这一过程相当于压栈. 回归:

C++应用中递归的利与弊

“递归”在C++(C++培训 )++中主要解决具有树型特征的算法或数据结构,递归的利用可以使算法或数据结构大大简化,代码简洁明了,相同一个具有该特性的课题采用递归或其他算法,所要求的预定义及相应的结果都将不一样,用了递归可能使用减少部份定义,代码实现部份大大减少,一看便知.下面是一个从数据库中取数的例子对比: 实现中所使用的数据结构(表结构) 序号 英文名 中文名 类型 说明 1 Id 权限ID Int 2 ParentId 父权限ID Int 用于指定父结点 3 Name 权限名称 Varch