C之递归函数(四十一)

  

,,,,,,,我们今天来讲下递归,递归是一种数学上的思想. .递归是将进行处理。

,,,,,,,,函数体内部可以调用自己,它的函数体中存在自我调用的函数;递归函数是递归的数学思想在程序设计中的应用,递归函数,函数的无限递归将导致程序栈溢出而崩溃。递归模型我们一般会表示成下面这样

 C之递归函数(四十一)

,,,,,,,,我们下面用递归的方法编写,思想就是下面这样

 C之递归函数(四十一)

,,,,,,,,具体代码如下

# include  & lt; stdio.h>      int  strlen_r (char * const  s)   {   ,,,如果(,* s )   ,,,{   ,,,,,,,return  1, +, strlen_r (s + 1);   ,,,}   ,,,   ,,,{   ,,,,,,,return  0;   ,,,}   }      int  main ()   {   ,,,printf (“% d \ n",, strlen_r (“abc"));   ,,,printf (“% d \ n",, strlen_r (“;”));   ,,,,   ,,,return  0;   }

,,,,,,,,我们看看编译结果

 C之递归函数(四十一)

,,,,,,,,结果如我们所想。下面我们来看看怎样用递归来实现:1,1,2,3,5,8,13,21日……后面的每个数就是前面的两个数字和,用公式表示出来就是这样

 C之递归函数(四十一)

,,,,,,,,我们来看看程序是怎样的

# include  & lt; stdio.h>      int  fac (int  n)   {   ,,,如果,n ==, 1,)   ,,,{   ,,,,,,,return  1;   ,,,}   ,,,else 如果(==,n  2,)   ,,,{   ,,,,,,,return  1;   ,,,}   ,,,   ,,,{   ,,,,,,,return  fac (n - 1), +, fac (n - 2);   ,,,}   ,,,,   ,,,return  1;   }      int  main ()   {   ,,,printf (“% d \ n",, fac (1));   ,,,printf (“% d \ n",, fac (2));   ,,,printf (“% d \ n",, fac (9));   ,,,,   ,,,return  0;   }

,,,,,,,,前面两个肯定打印出来的都是1,第3个打印出来的是34岁。我们来看看编译结果

 C之递归函数(四十一)

,,,,,,,,我们下来再来看看递归在问题中的应用,如下所示,将木块借助B柱由一个柱移动到C柱;每次只能移动一个木块;只能出现小木块在大木块之上;

 C之递归函数(四十一)

,,,,,,,,我们来分解下这个问题,将n - 1个木块借助C柱由一个柱移动到B柱,将最底层的唯一木块直接移动到C柱;将n - 1个木块借助一柱由B柱移动到C柱。我们来看看程序是怎么实现的

# include  & lt; stdio.h>      int  han_move (int  n, char ,, char  b, char  c)   {   ,,,如果,n ==, 1,)   ,,,{   ,,,,,,,printf (“% c ==祝辞,% c \ n",, a, c);   ,,,}   ,,,   ,,,{   ,,,,,,,han_move (n - 1,, a, c, b);   ,,,,,,,han_move (1,, a, b, c);   ,,,,,,,han_move (n - 1, b,, a, c);   ,,,}   }      int  main ()   {   ,,,han_move(3, & # 39;一个# 39;,,& # 39;b # 39;,, & # 39; c # 39;);   ,,,,   ,,,return  0;   }

,,,,,,,,我们看看编译结果

 C之递归函数(四十一)

,,,,,,,,我们看到已经正确实现了这个问题的解法。通过对递归的学习,总结如下:


,,,,,,,,

C之递归函数(四十一)