C语言——函数递归

article/2025/9/25 15:36:20

文章目录

  • 前言
  • 递归的概念
  • 递归的两个必要条件
  • 例题
    • 1.递归实现阶乘
    • 2.递归实现strlen函数
    • 3.计算一个正整数各位数字的和
    • 4.递归实现整数n的整数k次方
    • 5.递归实现斐波那契数
    • 6.递归实现字符串逆序
    • 7.汉诺塔
    • 8.青蛙跳台阶
    • 9.将一个十进制数以二进制的形式打印

前言

本文总结了几个递归基础例题,c语言实现

递归的概念

C语言允许函数调用它自己,这种调用过程叫做递归(recursion)

递归的两个必要条件

  1. 存在限制条件,当满足这个限制条件的时候,递归便不再继续
  2. 每次递归调用之后越来越接近这个限制条件

例题

1.递归实现阶乘

#include<stdio.h>
int Fac(int n)
{if(n<=1)return 1;elsereturn n*Fac(n-1);
}int main()
{int n;scanf("%d",&n);int ret=Fac(n);printf("%d\n",ret);return 0;
}

2.递归实现strlen函数

#include<stdio.h>
int Strlen(const char* str)
{if('\0'==*str)return 0;elsereturn 1+Strlen(str+1);
}int main()
{char arr[20]="Hello world!";int ret=Strlen(arr);printf("%d\n",ret);return 0;
}

3.计算一个正整数各位数字的和

#include<stdio.h>
unsigned fun(unsigned n)
{if(n>9)return n%10+fun(n/10);elsereturn n;
}int main()
{unsigned a=0;scanf("%d",&a);printf("%d\n",fun(a));return 0;
}

4.递归实现整数n的整数k次方

#include<stdio.h>
int fun(int n,int k)
{if(0==k)return 1;elsereturn fun(n,k-1);
}int main()
{int n;int k;scanf("%d %d",&n,&k);printf("%d\n",fun(n,k));return 0;
}

5.递归实现斐波那契数

#include<stdio.h>
int Fib(int n)
{if(n<=2)return 1;elsereturn Fib(n-1)+Fib(n-2);
}int main()
{int n;scanf("%d",&n);printf("%d\n",Fib(n));return 0;
}

6.递归实现字符串逆序

#include<stdio.h>
#include<string.h>
void reverse_string(char* str)
{int len=strlen(str);char tmp=*str;*str=*(str+len-1);*(str+len-1)='\0';if(strlen(str+1)>=2)reverse_string(str+1);*(str+len-1)=tmp;
}int main()
{char arr[20]="hello world!";printf("%s\n",arr);reverse_string(arr);printf("%s\n",arr);return 0;
}

在这里插入图片描述

讲解2
注意,前面6次函数调用都没有执行完该次调用,只执行到了上图箭头所指处,而在第6次调用时,if条件不满足,执行语句

*(str+len-1)=tmp;

每一级调用执行完该语句便返回上一级调用,字符数组里的内容依次变为

在这里插入图片描述
原字符串最后一个’\0’始终没有动到


7.汉诺塔

问题描述:
三根柱子A,B,C,最初一摞盘子下大上小的放在A柱子上,现要将盘子移动到C柱子上,要求:

  • 一次只能移动一个盘子
  • 大盘子不能放在小盘子上

请给出一个可行的方案(每一步怎么移动)

#include<stdio.h>
int count = 1;
void hanoi(int n, char a, char b, char c)//n个盘子从a借助b到c
{if (0 == n)return;hanoi(n - 1, a, c, b);printf("step %d: move %d from %c to %c\n", count++, n, a, c);hanoi(n - 1, b, a, c);//n-1个盘子从b借助a到c
}int main()
{int n;while (scanf("%d", &n)){hanoi(n, 'A', 'B', 'C');}return 0;
}

思路
为方便描述,盘子由小到大依次叫做1,2……,n
下面先用N=3的情形下给出一个解法,以得到一个直观的印象
在这里插入图片描述
第一步:
先把1移到C
在这里插入图片描述
第二步:
再把2移到B
在这里插入图片描述
第三步:
把1移回B
在这里插入图片描述
第四步:
把3移到C
在这里插入图片描述
第五步:
把1移到A
在这里插入图片描述
第六步:
把2移到C
在这里插入图片描述
第七步:
把1移到C,就完成了
在这里插入图片描述
以上的做法其实是遵循以下规则移动的:
对于有n个盘子

  1. 将n-1个盘子由A(借助C)移动到B
  2. 将第n个盘子由A移动到C
  3. 将n-1个盘子由B(借助A)移动到C
    以上三步便是汉诺塔问题的迭代公式,接下来只要考虑如何实现第一和第三步即可

那么如何将n-1个盘子由A(借助C)移动到B呢?

  1. 将n-2个盘子由A(借助B)移动到C
  2. 将第n-1个盘子由A移到B
  3. 将n-2个盘子由C(借助A)移动到B

那么如何将n-1个盘子由B(借助A)移动到C呢?

  1. 将n-2个盘子由B(借助C)移动到A
  2. 将第n-1个盘子由B移到C
  3. 将n-2个盘子由A(借助B)移到C

8.青蛙跳台阶

问题描述:
一只青蛙一次可以跳一级台阶或跳两级台阶(不能往回跳),问要跳上n级台阶有几种跳法

#include<stdio.h>int frog(int n)
{if (n == 1){return 1;}if (n == 2){return 2;}return frog(n - 1) + frog(n - 2);
}
int main()
{int n;scanf("%d", &n);int ways = frog(n);printf("%d\n", ways);return 0;
}

思路:
当N=1时,一种方法;
当N=2时,一次跳两级或两次跳一级,两种方法;
当N=3时,若先跳一级,则接下来的方法数即n=2时的方法数;若先跳两级,则接下来的方法数为n=1的方法数,根据加法原理,n=3的方法数为n=2的方法数+n=1的方法数
以此类推,N=n时的方法数为N=n-1的方法数加上N=n-2的方法数

本质上,这是和斐波那契数相同的问题


9.将一个十进制数以二进制的形式打印

void to_binary(int n);int main()
{int number;scanf("%d", &number);to_binary(number);return 0;
}void to_binary(int n)
{if (n >= 2)to_binary(n / 2);printf("%d", n%2);return;
}

从本题可以看出,递归在处理倒序问题时非常方便。
对于一个十进制数字,对2求模得到的结果实际上是待输出二进制数的最后一位,这一规律提示我们在递归函数的调用之前计算n%2,在递归调用之后打印计算结果。这样计算的第一个值正好是最后一个打印的值。


http://chatgpt.dhexx.cn/article/RebPPpiq.shtml

相关文章

C语言的递归函数

递归函数&#xff08;一&#xff09; 递归就是一个函数在它的函数体内调用它自身。 执行递归函数将反复调用其自身&#xff0c;每调用一次就进入新的一层。 注意递归函数必须有结束条件 递归函数&#xff08;二&#xff09; 5的阶乘这个例子进行一下剖析&#xff0c;看一看他…

函数递归调用(c语言为例)

定义:在调用一个函数的过程中又出现直接或间接调用该函数本身&#xff0c;称为函数的递归调用。 int fun(int x){return fun(x2);//在执行f函数的过程中又要调用f函数 } 在调用函数f的过程中&#xff0c;又要调用f函数&#xff0c;这是直接调用本函数&#xff0c;如图1 图 1 如…

【C语言】函数递归(详解)

文章目录 函数递归什么是递归&#xff1f;递归的俩个必要条件代码引例1栈溢出&#xff08;Stack Overflow&#xff09; 合理使用递归代码引例3代码引例4解释要合理使用递归 结束语 函数递归 程序调用自身的编程技巧称为递归 recursion&#xff09; 函数自己调用自己就是递归 …

php熔断,微服务-API熔断原理

伴随微服务&#xff0c;出现了很多新鲜的名词&#xff0c;其实剥去外衣并没有那么高大上。 今天要谈到的&#xff0c;叫做”熔断”&#xff0c;一个典型的开源实现是Hystrix(JAVA实现)。 背景 一个分布式系统中&#xff0c;服务间互相调用错综复杂&#xff0c;假设某个基础服务…

接口熔断 java_SpringCloud(五):服务熔断与熔断监控

一、概念部分 1.什么是熔断器? 熔断,就是断开与服务器的连接,熔断器是在服务不可用的时候主动断开,以免造成更多的雪崩效应,他是保护服务高可用的最后一道防线。 2.为什么需要熔断器? 为保证服务高可用,最先想到的是服务集群,但集群并不能完全的保证服务高可用, 当某个…

分布式系统服务熔断

# 服务熔断 - “熔断器”本身是一种开关装置&#xff0c;当某个服务单元发生故障之后&#xff0c;通过断路器(hystrix)的故障监控&#xff0c;某个异常条件被触发&#xff0c;直接熔断整个服务。向调用方法返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或…

微服务熔断

https://mp.weixin.qq.com/s/cxd0Fol4BBzx4v2qm-hlwQ 我这篇文章来的晚了些&#xff0c;因为hystrix已经进入维护模式。但已经有非常多的同学入坑了&#xff0c;那么本篇文章就是及时雨。本文将说明熔断使用的一些注意事项&#xff0c;可能会细的让你厌烦。 前半段&#xf…

【服务熔断】服务熔断完整说明

文章目录 1.创始人文档2.熔断机制3.原理总结4.断路器打开之后5.服务监控hystrixDashboarda.七色b.一圈c.一线d.单个图说明e.多个图说明 1.创始人文档 大神文档 2.熔断机制 熔断机制概述 熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务出错不可用…

Istio的熔断

一、理解熔断   熔断&#xff08;Circuit Breaker&#xff09;&#xff0c;原是指当电流超过规定值时断开电路&#xff0c;进行短路保护或严重过载时的一种保护机制。后来熔断也广泛应用于金融领域&#xff0c;指当股指波幅达到规定的熔断点时&#xff0c;交易所为控制风险采…

hystrix熔断

熔断操作放在服务提供层&#xff0c;是在类的方法上&#xff0c;而降级是在消费者的接口层面设置 1.加入jar包 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-hystrix</artifactId><version&…

服务熔断降级

之前给大家讲了很多服务之前的关系&#xff0c;今天主要给大家介绍&#xff0c;当服务出现问题时&#xff0c;我们该如何解决。 首先我们先进行一些场景分析&#xff1a; 场景一 服务提供端提供了A、B、C、D 4个服务&#xff0c;服务调用方调用服务时&#xff0c;D服务出现了…

Hystrix 服务熔断

目录 服务雪崩 一、什么是Hystrix 二、服务熔断 案例 三、服务降级 什么是服务降级 降级工厂类 设置fallbackFactory 开启feign.hystrix 四、服务熔断和降级的区别 五、DashBoard流监控 添加依赖 分布式系统面临的问题&#xff1a; 复杂分布式体系结构中的应用程序…

sentinel 熔断降级

sentinel 熔断降级 官网&#xff1a;https://sentinelguard.io/zh-cn/docs/circuit-breaking.html 熔断降级 熔断降级&#xff1a;服务由于响应慢、异常等原因触发熔断策略后&#xff0c;快速失败&#xff0c;避免线程堆积造成服务雪崩&#xff08;熔断降级通常在调用端配置&am…

kong网关熔断插件

Request Termination经常被作为kong的熔断器使用。以下在自建的konga管理界面里进行了测试配置 配置参数如下&#xff1a; 客户端发起请求&#xff0c;可以通过response进行验证&#xff0c;可以看到响应的状态码和报文都能生效。 以上配置是基于kong 0.12.3&#xff0c;可…

服务熔断的实现

# 0.服务熔断的实现思路 - 引入hystrix依赖,并开启熔断器(断路器) - 模拟降级方法 - 进行调用测试 # 1.项目中引入hystrix依赖 <!--引入hystrix--> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-start…

熔断

我们知道&#xff0c;如果一个软件系统的并发请求数目超过了系统的最佳线程数&#xff0c;那么就会导致激烈的资源竞争&#xff0c;随着资源的匮乏甚至枯竭&#xff0c;整个系统也就面临着灾难。所以&#xff0c;很多软件系统为了保证即使在出现并发用户数>最佳线程数时&…

什么是服务熔断?

一、什么是服务熔断&#xff1f; 考试过程中当断则断的方式&#xff0c;正好符合微服务架构中的一种安全机制&#xff1a;【熔断】 熔断这一概念来源于电子工程中的断路器&#xff08;Circuit Breaker&#xff09;。 在互联网系统中&#xff0c;当下游服务因访问压力过大而响应…

熔断原理分析与源码解读

熔断机制&#xff08;Circuit Breaker&#xff09;指的是在股票市场的交易时间中&#xff0c;当价格的波动幅度达到某一个限定的目标&#xff08;熔断点&#xff09;时&#xff0c;对其暂停交易一段时间的机制。此机制如同保险丝在电流过大时候熔断&#xff0c;故而得名。熔断机…

【C++程序设计语言A视频教程 全12讲 中科院】【下载链接】

C程序设计语言A视频教程 全12讲 中科院 这个是我在淘宝上面买的 杨力祥老师的教程~~ 奉献给大家~~~ *************************************************************************************************************************************** 下面是网上对杨力祥老师的…

国科大杨力祥老师操作系统答案总结

基于网上搜索的版本以及历届师兄的版本&#xff0c;进行了整合和修改 对应参考书籍如下&#xff0c;对应P页数也是指该书的页数。 1.为什么开始启动计算机的时候&#xff0c;执行的是BIOS代码而不是操作系统自身的代码&#xff1f; 最开始启动计算机的时候&#xff0c;计算机…