,,,,,,,我们今天来讲下递归,递归是一种数学上的思想. .递归是将进行处理。
,,,,,,,,函数体内部可以调用自己,它的函数体中存在自我调用的函数;递归函数是递归的数学思想在程序设计中的应用,递归函数,函数的无限递归将导致程序栈溢出而崩溃。递归模型我们一般会表示成下面这样
,,,,,,,,我们下面用递归的方法编写,思想就是下面这样
,,,,,,,,具体代码如下
# 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; }
,,,,,,,,我们看看编译结果
,,,,,,,,结果如我们所想。下面我们来看看怎样用递归来实现:1,1,2,3,5,8,13,21日……后面的每个数就是前面的两个数字和,用公式表示出来就是这样
,,,,,,,,我们来看看程序是怎样的
# 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岁。我们来看看编译结果
,,,,,,,,我们下来再来看看递归在问题中的应用,如下所示,将木块借助B柱由一个柱移动到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; }
,,,,,,,,我们看看编译结果
,,,,,,,,我们看到已经正确实现了这个问题的解法。通过对递归的学习,总结如下:
,,,,,,,,