目录
前言
递归在计算机科学中是一个重要的概念,它指的是一个函数直接或间接地调用自身的过程。在C语言中,递归通常用于解决问题的分治或分解,将一个大问题拆分成较小的同类问题来解决。递归函数必须包含一个递归出口,即递归调用的条件,否则会导致无限循环而造成栈溢出。
一、递归原理
二、栈溢出
无终止条件会产生栈溢出的情况
#include <stdio.h>
int fun01(int n);
int main ()
{
printf("%d\n",fun01(5));
return 0;
}
int fun01(int n)
{
/*if (n==1)
{
return 1;
}*/
return n*fun01(n-1);
}
三、案例
1、两个整数的最大公约数
#include <stdio.h>
int fun11(int m,int n);
int main ()
{
/* 递归实现:两个正整数的最大公约数 */
printf("%d\n",fun11(124,36 ));
return 0;
}
int fun11(int m,int n)
{
if (m % n == 0)
return n;
return fun11(n,m%n);
}
2、裴波那契序列
知道前两项的初始值作为递归结束条件,后一个数等于前两个数之和需要用递归调用得到。
#include <stdio.h>
int fun13(int n);
int main ()
{
/*用递归算法实现斐波那契数列: */
int i;
for(i=1;i<=20;i++)
{
printf("%d,",fun13(i));
}
return 0;
}
int fun13(int n)
{
if (n==1||n==2)
{
return 1;
}
return fun13(n-1)+fun13(n-2);
}
3、汉诺塔
#include <stdio.h>
void fun14(int n, char from,char mid,char to);
int main ()
{
/* 汉诺塔 */
fun14(3, 'a','b','c');
return 0;
}
void fun14(int n, char from,char mid,char to)
{
if (n == 1)
{
printf("%c->%c\n", from, to);
}
else
{
fun14(n - 1, from, to, mid);
printf("%c->%c\n", from, mid,to);
fun14(n - 1, mid, from, to);
}
}
4、判断是否为回文数
#include <stdio.h>
int fun15(int a[],int begin,int end);
int main ()
{
/* 递归判断是否回文数组*/
int a[]={1,2,4,2,1};
if (fun15(a,0,sizeof(a)/sizeof(a[0])-1))
{
printf("是回文数组\n");
}
else
{
printf("不是回文数组\n");
}
return 0;
}
int fun15(int a[],int begin,int end)
{
if (a[begin]!=a[end])//一定不是回文
{
return 0;
}
else if (begin==end||begin+1==end&&a[begin]==a[end])//一定是
{
return 1;
}
else if (a[begin]==a[end])
{
fun15(a,begin+1,end-1);
}
}
总结
在C语言中,递归函数的设计需要考虑清楚递归调用的条件和递归出口,以及递归过程中相关变量的维护和更新。递归的应用领域很广泛,例如在数据结构、算法、图论等领域都有重要的应用。对于初学者来说,理解递归思想并熟练掌握递归函数的设计是很有意义的。