简单谈谈 C/C++ 递归的思想,实现,以及和循环的关系。
来源:互联网 发布:淘宝重复铺货 编辑:程序博客网 时间:2024/05/16 06:09
很多初学者往往对递归迷惑不解,也在这上面花了不少的时间。其实教材上的例子很经典,只是它说的有一些唠叨了。初学者会看的头大的。编程是解决问题的,而现实中很多的问题都是比较简单的,没有象汉诺塔那么复杂。我们也不必追究递归到底是怎样实现的,我们只是要会用递归,会用递归来为我们解决一些问题,这就行了。
首先来看一个例子:
有一个Febonacci序列:
1,1,2,3,5,8,13,,21,34........
它的问题是:求这个序列中的第N个数。
由于它的函数原形是:f(n)=f(n-1)+f(n-2)
这用递归很容易就可以写出代码来,一点都不费事:
噢~~~~~也许你会说递归真是太简单了,简直就是一个数学模型嘛,呵呵。
其实,递归函数的工作过程就是自己调用自己。有一些问题用递归就很容易解决,简单的你自己都会吃惊。
我们做事情,一般都是从头开始的,而递归却是从末尾开始的。比如上面的函数吧,当n>3时,它显然只能求助于n-1,n-2。而(n-1)>2,(n-2)>2时,它们就求助于:(n-1)-1,(n-1)-2;(n-2)-1,(n-2)-2;然后··············直到(n-k)<3,(n-k-1)<3时,函数Febc终于有了返回值1 了,它再从头开始计算,然后一直算到n 为止。
通过上面的例子,我们知道递归一定要有一个停止的条件,否则递归就不知道停止了。在上面的例子中, if(n<3) return (1); 就是停止的条件。
然而,使用递归的代价是十分巨大的:它会消耗大量的内存!!递归循环时它用的是堆栈,而堆栈的资源是十分有限的。上面的例子你只能用一个很小的n值。如果n=20,即Febc(20)的话,它将调用Febc(n)函数10000多次!!!而上面一个例子用循环也是十分容易写的:
有兴趣者不妨输入一个较大的n值,然后比较比较这二个函数计算的速度。当然, 如果你使用的n太大的话,递归可能发生错误。如果死机了可别骂我哦~~~ 我已经提醒过你了 :)
现在我们再来看看一个求从1 加到100的循环:
这很简单没什么可说的。 但是,你能不能写出相应的递归函数呢?
下面就是递归(请注意了,这种做法不推荐!! 我只是为了说明问题才这么写的。)
在C/C++的问题中,我曾经回答过这样的一个问题:
若一头小母牛,从出生起第四个年头开始每年生一头母牛,按此规律,第n年时有多少头母牛? 请问如何用递归涵数求此问题?
先写出函数表达式:
f(n)=f(n-1)+f(n-3)
为什么f(n)=f(n-1)+f(n-3)呢,请看:
f(n)-f(n-1)=f(n-3)
因为第n年要比n-1年多的牛,都是大于三岁的牛生的小牛,而f(n-3)正是那些在n年大于三岁的牛,然后它们在第n年生下相同数量的小牛。(请用BorlandC++3.1或其他C++编译器)
怎么样,很简单吧。 会用循环求解吗?
递归在实际的编程中并不常用,但是在某些情况下,它是非常强有力而漂亮的工具。掌握它的原理时会十分有用的。
- 初学者看过来:简单谈谈 C/C++ 递归的思想,实现,以及和循环的关系。
- 简单谈谈 C/C++ 递归的思想,实现,以及和循环的关系。
- 初学者看过来:简单谈谈 C/C++ 递归的思想,实现,以及和循环的关系
- 简单谈谈 C/C++ 递归的思想,实现,以及和循环的关系
- C:单链表的循环和递归实现
- 简单的C语音字符串和整数以及浮点数互转(递归实现)
- 简单谈谈lua和c的交互
- 递归和循环的关系
- C语言-循环队列的简单实现
- c语言中的函数的定义以及相关的调用、嵌套、递归以及和数组的关系
- 二分查找法的C语言实现:递归与循环
- 简单二分查找和递归的思想
- 递归的一些简单实现(c实现)
- 简单谈谈对Object C的理解
- 谈谈“模式思想”与框架的关系
- 折半查找的递归和非递归实现(C++)
- C/C++:递归的一个简单示例
- 排列和组合简单的递归思路以及C++实现
- 何为抓住机遇,何谓现实社会
- 临时性道指令程序测试
- 感染ELF文件(2)
- SPL - QQ空间日志查看工具 v1.1.0.441
- 心烦
- 简单谈谈 C/C++ 递归的思想,实现,以及和循环的关系。
- 读谁动了我的奶酪---故事背后的故事
- Unix/Linux中的/dev/fd机制
- Velocity是什么?
- 最"小"的程序--内嵌汇编实现的hello world
- Unix环境高级编程 第三章习题答案
- 控制工具栏停靠的位置。
- 让Windows Server 2008+IIS 7+ASP.NET支持10万个同时请求
- 最全的acm资料web