专题:递归: 知识点一:函数的调用 当在一个函数的运行期间调用另一个函数时,在运行被调函数之前,系统需要完成三件事: 将所有的实际参数,返回地址等信息传递给被调函数。 为被调函数的局部变量(也包括形参)分配存储空间 将控制转移到被调函数的入口 从被调函数返回主调函数之前,系统也要完成三件事: 保存被调函数的返回结果 释放被调函数所占的存储空间 依照被调函数保存的返回地址将控制转移到调用函数 当有多个函数相互调用时,按照“后调用先返回”的原则,上述函数之间信息传递和控制转移必须借助“栈”来实现,即系统将整个程序 运行时所需的数据空间安排在一个栈中,每当调用一个函数时,将在栈顶分配一个存储区,进行压栈操作,每当一个函数退出时,就释放它的存储区,就进行出栈操作,当前运行的函数永远都在栈顶位置。 A函数调用A函数和A函数调用B函数在计算机看来是没有任何区别的,只不过用我们日常的思维方式比较怪异而已。 知识点二:递归必须满足的三个条件 递归必须得有一个明确的终止条件 该函数所处理的数据规模必须在递减 这个转化必须是可解的 知识点三:递归和循环的优缺点比较 递归: 易于理解 速度慢 存储空间大 循环 不易理解 速度快 存储空间小 知识点四:递归的应用 树和森林就是以递归的方式定义的 树和图的很多算法都是以递归来实现的 很多数学公式就是以递归的方式定义的 斐波拉契序列:1 2 3 5 8 13 21 34
//**************
专题:递归【这对你的编码能力是个质的飞跃,如果你想成为一个很厉害的
程序员,数据结构是必须要掌握的,因为计算机专业的本科生也达不到这水
平!计算机特别适合用递归的思想来解决问题,但是我们人类用递归的思想
来考虑问题就会感到十分困扰,这也是很多学过递归的人一直都搞不明白的
地方!那是不是递归可以随便写,当然不是,有些同学一用递归程序就死翘
翘了。递归的思想是软件思想的基本思想之一,在树和图论上面,几乎全是
用递归来实现的,最简单,像求阶乘这种没有明确执行次数的问题,都是用
递归来解决】
定义:
一个函数自己直接或间接调用自己(一个函数调用另外
一个函数和他调用自己是一模一样的,都是那三步,
只不过在人看来有点诡异。)
递归满足的三个条件:
1、递归必须得有一个明确的终止条件
2、该函数处理的数据规模必须在递减
3、这个转化必须是可解的。
循环和递归:
理论上循环能解决的,肯定可以转化为递归,但是这个
过程是复杂的数学转化过程,递归能解决不一定能转化
为循环,我们初学者只要把经典的递归算法看懂就行,
至于有没有能力运用看个人。
递归:
易于理解
速度慢
存储空间大
循环
不易于理解
速度快
存储空间小
举例:
1.求阶乘
2.1+2+3+4+。。。+100的和
3.汉诺塔
【汉诺塔】这不是线性递归,这是非线性递归!
n=1 1
n=2 3
n=3 7
.........
.........
n=64 2的64次方减1【这是个天文数字,就算世界上最快的计算机
也解决不了,汉诺塔的负责度是2的n次方减1】问题很复杂,但真正解决
问题的编码只有三句。
4.走迷宫(CS的实现)
递归的运用:
树和森林就是以递归的方式定义的
树和图的很多算法都是以递归来实现的
很多数学公式就是以递归的方式定义的
斐波拉契序列
1 2 3 5 8 13 21 34。。。
//*****************************
为何数据结构难学:
因为计算机内存是线性一维的,而我们要处理的数据都是比较复杂的,那么怎么把这么多复杂的数据保存在计算机中来保存本身就是一个难题,而计算机在保存线性结构的时候比较好理解,尤其是数组和链表 只不过是连续和离散的问题,线性结构是我们学习的重点,因为线性算法比较成熟,无论C++还是Java中都有相关的工具例如Arraylist.Linkedlist,但是在Java中没有树和图,因为非线性结构太复杂了,他的操作 远远大于线性结构的操作。即使SUN公司也没造出来。
小复习一下:^_^
逻辑结构:(就是在你大脑里面能产生的,不考虑在计算机中存储)
线性(用一根直线穿)
在计算机中存储用:
数组
链表
栈和队列是一种特殊的线性结构,是具体应用。
(操作受限的线性结构,不受限的应该是在任何地方可以增删改查
可以用数组和链表实现。只要把链表学会,栈和队列都能搞定,数
组稍微复杂一些。)
非线性:
树
图
物理结构:
数组
链表
模块二:非线性结构(现在人类还没有造出一个容器,能把树和图
都装进去的,因为他们确实是太复杂了)
(都要靠链表去实现)