C语言之递归

ops/2025/2/25 2:59:49/

目录

前言

一、递归原理

二、栈溢出

三、案例

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


http://www.ppmy.cn/ops/161097.html

相关文章

CSS中伪类选择器

作用:选中特殊状态的元素 如何理解"伪"?--虚假的,不真实的 如何理解"伪类"?--像类(class),但是不是类,是元素的一种特殊的状态. 一.动态伪类选择器 1. :link 超链接未被访问的状态; 2. :visited 超链接访问过的状态; 3. :hover 鼠标悬停在元素…

1.1 go环境搭建及基本使用

golang下载地址&#xff1a; Download and install - The Go Programming Language (google.cn) 验证安装是否成功&#xff1a; go version 查看go环境 go env 注意&#xff1a;Go1.11版本之后无需手动配置环境变量,使用go mod 管理项目&#xff0c;也不需要把项目放到GO…

基于数据可视化学习的卡路里消耗预测分析

数据分析实操集合&#xff1a; 1、关于房间传感器监测数据集的探索 2、EEMD-LSTM模型择时策略 — 1.EEMD分解与LSTM模型搭建 3、EEMD-LSTM模型择时策略 — 2. 量化回测 4、国际超市电商销售数据分析 5、基于问卷调查数据的多元统计数据分析与预测&#xff08;因子分析、对应分…

Redis 设置密码无效问题解决

一、验证密码有没有生效 运行cmd&#xff0c;cd到redis的目录下 输入“redis-cli.exe” 回车 输入“auth 123456” 回车 若错误&#xff0c;说明没有设置密码或者设置的密码没有生效 输入“exit” 回车就立即退出redis 二、解决方案是&#xff1a;直接修改后缀是 .conf 的…

【Redis】基础知识入门

文章目录 Redis 入门SQL && NoSQLRedis 介绍 Redis 常见命令Redis数据结构介绍通用命令String 类型基本内容介绍常见的命令key 的结构 Hash类型基本内容介绍常见命令 List类型基本内容介绍常见命令 Set类型基本内容介绍常见命令 SortedSet 类型基本内容介绍常见命令 Re…

【Python爬虫(55)】Scrapy进阶:深入剖析下载器与下载中间件

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…

Deepin(Linux)设置开机自动启动 MySQL

要在系统启动时自动启动 MySQL&#xff0c;可以通过配置 systemd 来实现。由于已经完成了 MySQL 的安装并且能够启动 MySQL 服务&#xff0c;接下来我们将创建一个 systemd 服务单元文件&#xff0c;让 MySQL 在系统启动时自动启动。 1. 创建 systemd 服务文件 首先&#xff…

拼多多面试题记录

0 问题汇总 以下内容为经过豆包的回答,不一定对,只为自己学习使用 1 C++11有哪些新特性? 语言易用性增强 统一的初始化语法 C++11 引入了花括号初始化器(列表初始化),可以用于各种类型的初始化,包括基本类型、数组、容器等,并且可以防止窄化转换。 自动类型推导 auto …