C语⾔中的特殊函数(持续更新中)
1、递归函数
1.1、递归函数:⼀个函数调⽤它⾃⼰本⾝,则这个函数就是递归函数。
1.2、使⽤递归函数的条件:
1.2.1、采⽤递归⽅法来解决问题,必须符合以下三个条件:
1.2.1.1、可以把要解决的问题转化为⼀个新问题,⽽这个新的问题的解决⽅法仍与原来的解决⽅法相同,只
所处理的对象有规律地递增或递减。
说明:解决问题的⽅法相同,调⽤函数的参数每次不同(有规律的递增或递减),如果没有规律也就不能适
c语言用递归函数求n的阶乘 ⽤递归调⽤。
1.2.1.2、可以应⽤这个转化过程使问题得到解决。
说明:使⽤其他的办法⽐较⿇烦或很难解决,⽽使⽤递归的⽅法可以很好地解决问题。
1.2.1.3、必定要有⼀个明确的结束递归的条件。
说明:⼀定要能够在适当的地⽅结束递归调⽤。不然可能导致系统崩溃。
1.3、递归函数说明:
1.3.1、当函数⾃⼰调⽤⾃⼰时,系统将⾃动把函数中当前的变量和形参暂时保留起来,在新⼀轮的调⽤过程
中,系统为新调⽤的函数所⽤到的变量和形参开辟另外的存 储单元(内存空间)。每次调⽤函数所使⽤的变
量在不同的内存空间。
1.3.2、递归调⽤的层次越多,同名变量的占⽤的存储单元也就越多。⼀定要记住,每次函数的调⽤,系统都会为该函数的变量开辟新的内存空间。
1.3.3、当本次调⽤的函数运⾏结束时,系统将释放本次调⽤时所占⽤的内存空间。程序的流程返回到上⼀层
的调⽤点,同时取得当初进⼊该层时,函数中的变量和形参 所占⽤的内存空间的数据。
1.3.4、所有递归问题都可以⽤⾮递归的⽅法来解决,但对于⼀些⽐较复杂的递归问题⽤⾮递归的⽅法往往使
程序变得⼗分复杂难以读懂,⽽函数的递归调⽤在解决这类 问题时能使程序简洁明了有较好的可读性;但由
于递归调⽤过程中,系统要为每⼀层调⽤中的变量开辟内存空间、要记住每⼀层调⽤后的返回点、要增加许
多额外的 开销,因此函数的递归调⽤通常会降低程序的运⾏效率。
1.4、递归函数的优缺点:
1.4.1、缺点:
递归快速耗内存
不⽅便阅读和维护
效率低
1.4.2、优点:
简洁
适合解决阶乘、涉及相反顺序的编程问题
1.5、递归函数实例:
// 函数 binarySearch() 在排序好的数组中搜索
// 参数:需要搜索的元素值;待搜索的long类型数组;数组的长度
// 返回值:指向满⾜搜索条件的元素的指针,或者为NULL,如果数组中没有元素满⾜搜索条件。
long *binarySearch( long val, long array[ ], int n )
{
int m = n/2;
if ( n <= 0 ) return NULL;
if ( val == array[m] ) return array + m;
if ( val < array[m] ) return binarySearch( val, array, m );
else return binarySearch( val, array+m+1, n-m-1 );
}
在例 ⼦ 中,递归函数 binarySearch()实现⼆元搜索算法,在排序好的数组中到特定元素。⾸先,该函数根据搜索条件⽐较数组最中间的元素。如果相同,就返问该元素的指针,表⽰到了;如果不相同,该函数会调⽤⾃⼰,在可能存在满⾜搜索条件的⼀半数组中搜索,⼀直递归地进⾏下去,指导到满⾜搜索条件的元素。如果剩下数组的长度为 0,则表⽰不到,那么递归就会结束。
对于有 n 个元素的数组来说,⼆元搜索算法进⾏最多 1+log2(n)次⽐较。如果有⼀百万个元素,最多⽐较 20 次,也就是最多 20 次递归执⾏函数 binarysearch()。
递归函数基于了这样⼀个事实:每次调⽤函数时,都会重新建⽴动态变量。这些变量,以及返回时需要的调⽤者地址,都存储在栈中,每次函数递归都会造成栈上新增⼀块数据。程序员要确保栈的空间
够⼤,⾜以容纳递归的中间处理过程。不过例 1 中的函数 binarySearch()对于栈空间的要求并不⼤。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论