#includeintfibonacci(intn)
{if(n1||n2)//递归都结束了的条件,求前两项return1argumentsreturnfibonacci(n-1)fibonacci(n-2)//要是是求其它项,先要求出它前面两项,后再做和。}intmain()
{intnprintf(
递归函数是设计和请看算法的一种有力的工具,因此它在紧张算法的描述中被经常采用,甚至于在及时能介绍其他算法设计方法之前先继续讨论它。
能常规递归过程描述的算法大多数有这样的特征:为求解规模为n的问题,另想办法将它分解成规模小的问题,然后把从这些小问题的解方便地基本构造出大问题的解,而且这些规模较小的问题也能需要则是的分解和综合考方法,可分解成规模更小的问题,并从这些更小问题的解构造出规模较大问题的解。特别地,当规模n1时,能就得解。
递归算法算法的执行过程分递推和回归两个阶段。在递推阶段,把较急切的问题(规模为n)的求解推到比原问题简单点一点的问题(规模小于n)的求解。比如上例中,求解释fib(n),把它推到求高人fib(n-1)和fib(n-2)。也就是说,为算出fib(n),前提是先计算出fib(n-1)和fib(n-2),而计算fib(n-1)和fib(n-2),又前提是先可以计算fib(n-3)和fib(n-4)。以此类推,直至计算fib(1)和fib(0),三个能立即能得到结果1和0。在递推阶段,可以要有中止递归函数的情况。例如在函数fib中,当n为1和0的情况。
在轮回阶段,当完成最简单情况的解后,层层传递回,排列我得到稍复杂问题的解,或者能得到fib(1)和fib(0)后,赶往能得到fib(2)的结果,……,在得到了fib(n-1)和fib(n-2)的结果后,赶往换取fib(n)的结果。
在c语言程序递归函数函数时要尽量,函数中的局部变量和参数知识局限于当前调用层,当递推进入“很简单问题”层时,原先层次上的参数和局部变量便被隐蔽的地方过来。在一系列“简单问题”层,它们各有自己的参数和局部变量。
的原因递归紊乱一系列的函数调用,而且很有可能会有一系列的重复一遍算出,递归函数算法的执行效率总体较高。当某个递归算法能较方便啊地转换的成递推算法时,通常按递推算法编写程序。比如上例可以计算斐波那契数列的第n项的函数fib(n)应需要递推算法,即从斐波那契数列的前两项向北出发,逐次由前两项计算出出下一项,转眼计算出出要求的第n项。
中,选择排序法是对定位也很同样法的一种加以改进。在讲选择排序法之前我们先来所了解看看定位比较比较相互法。是为便于理解,设有10个数三个未知数组元素a[0]~a[9]中。定位比较比较收集法是从粗到细依次定位范围a[0]~a[9]中恰当的值(和武林大会中的比武切磋应该差不多),a[9]中放的恐怕是最小的数。如实现定位a[0],先简单假设a[0]中当前值是最大数,a[0]与后面的元素再次都很,如果a[4]极大,则将a[0]、a[4]交换,a[0]已自动更新再与后面的a[5]~a[9]比较好,假如a[8]还得大,则将a[0]、a[8]交换,a[0]又是新数,再与a[9]都很。一轮比完以后,a[0]那是最大的数了,本次比武切磋的武状元孕育而出了,这一次从a
下面给大家一个例子:
mai()
{
inta[10]
inti,j,t
for(i0i
for(i0i
for(ji1j
if(a[i]
for(i0i
}
啦,罗嗦了半天后好不容易把定位也很排序法回答完了,这个方法确实不错,容易理解,那就是好像有点请,一把椅子带给换去,哎~
所以我就有了下面的选择排序法,又开始的时候椅子谁也不给,放在旁边一边让大家看着远处,找个人k记录比赛结果,然后再发椅子。具体详细来讲呢应该是,改进定位也很排序法,可是这个改进仅仅一部分,比较的次数没变,该咋打我还是怎莫打,就是你不换椅子了。你每次外循环先将定位元素的小标i值记录到k,如果说a[k]是比较大元素其实ik那就a[i]比较大,a[k]与后面的元素一一也很,该同样的确实是也不换,是把k的值决定再看看就完了,后来在把a[k]与a[i]相互交换,那样的话a那是大的的元素了。然后把进入下箭雨的比较好。选择类型排序法与定位比较排序法相比较比较,比的次数没变,交换的次数增加了。
下面也写个例子:
main()
{
inta[10]
inti,j,t,k
for(i0i
for(i0i
{ki/*裁判and记者实时跟踪报纸比赛情况*/
for(ji1j
if(a[k]
ta[i]a[i]a[k]a[k]t/*t发放奖品*/
}
for(i0i
}