Bootstrap

C语言之递归

目录

前言

一、递归原理

二、栈溢出

三、案例

 1、两个整数的最大公约数

2、裴波那契序列

3、汉诺塔

​4、判断是否为回文数

总结


前言

        递归在计算机科学中是一个重要的概念,它指的是一个函数直接或间接地调用自身的过程。在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语言中,递归函数的设计需要考虑清楚递归调用的条件和递归出口,以及递归过程中相关变量的维护和更新。递归的应用领域很广泛,例如在数据结构、算法、图论等领域都有重要的应用。对于初学者来说,理解递归思想并熟练掌握递归函数的设计是很有意义的。

;