当前位置: 首页 > news >正文

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

相关文章:

  • 【排序算法】六大比较类排序算法——插入排序、选择排序、冒泡排序、希尔排序、快速排序、归并排序【详解】
  • 【架构】事件驱动架构(Event - Driven Architecture,EDA)
  • electron提升软件运行权限,以管理员权限运行
  • Linux 常见指令
  • Linux之文件系统
  • Swiper插件的运用和学习
  • 【IO】java IO流的类型及IO模型
  • 大模型本地部署对于硬件配置要求太高,云端运行又担心数据泄露,有什么办法可以避免数据泄露又能够运行比较大的模型吗
  • ubuntu 源码编译ffmpeg
  • 大模型提示词工程实战
  • Linux中的查看命令
  • kkFileView报错no office manager available
  • 【数电笔记】第一章 数制和码制
  • 计算机毕业设计SpringBoot+Vue.js学生读书笔记共享(源码+LW文档+PPT+讲解+开题报告)
  • 【微服务】深入解析spring aop原理
  • 【0409】Postgres内核 CREATE DATABASE 之 从 new_record[] 加载 tuple 数据部分 到 堆空间指定区域 ⑥
  • 机器翻译与语音识别技术:推动人机交互的新篇章
  • Java数据结构_一篇文章搞定java对象的比较_7
  • 基于Weber和simulink的齿轮啮合刚度计算
  • 基于深度学习与知识图谱的设备智能维护系统KGPHMAgent
  • 视频丨美国两名男童持枪与警察对峙,一人还试图扣动扳机
  • 云南威信麟凤镇通报“有人穿‘警察’字样雨衣参与丧事”:已立案查处
  • 极限拉扯上任巴西,安切洛蒂开启夏窗主帅大挪移?
  • 工人日报评规范隐藏式车门把手:科技美学须将安全置顶
  • 人民日报钟声:通过平等对话协商解决分歧的重要一步
  • 扶桑谈|从石破茂“越菲行”看日本周边外交布局战略新动向