C语言中的特殊函数(持续更新中)

1、递归函数
1.1、递归函数:一个函数调用它自己本身,则这个函数就是递归函数。
1.2、使用递归函数的条件:
1.2.1、采用递归方法来解决问题,必须符合以下三个条件:
  1.2.1.1、可以把要解决的问题转化为一个新问题,而这个新的问题的解决方法仍与原来的解决方法相同,只
   所处理的对象有规律地递增或递减。
  说明:解决问题的方法相同,调用函数的参数每次不同(有规律的递增或递减),如果没有规律也就不能适
  用递归调用。
  
  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()对于栈空间的要求并不大。

猜你喜欢

转载自blog.csdn.net/qq_36187809/article/details/87620223
今日推荐