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

article/2025/9/25 15:28:04

定义:在调用一个函数的过程中又出现直接或间接调用该函数本身,称为函数的递归调用。

int fun(int x){return fun(x+2);//在执行f函数的过程中又要调用f函数
}

    在调用函数f的过程中,又要调用f函数,这是直接调用本函数,如图1


                        图 1

    如果在调用f1函数过程中要调用f2函数,而在调用f2函数的过程中又要调用f1函数,就是间接调用本函数,见图2

                        图2

    不过图1与图2这两种递归调用都是无终止的自身调用。显然程序中不应该出现这种无终止的自身调用,而只应出现有限次数、有终止的递归调用,这可以通过if语句来控制,只有在某一条件成立时才继续执行递归调用;否则就不再继续。

    关于递归的概念,有些初学者感到不好理解,下面举一谭浩强老师的《c程序设计(第四版)》中的例子说明:

例一:有5个学生在一起,问第五个学生多少岁,他说他比第四个学生大2岁;问第四个学生多少岁,他说比第三个学生大2岁……最后问第一个学生,他说是10岁。请问第5个学生多大。

思路1:顺序法age1 = 10;age2 = age1 + 2; …; age5 = age4 + 2;则可以通过for循环解决问题:

void main() {int age[5] = {0}; age[0] = 10;for(int i = 0; i < 4 ;i++) {age[i + 1] = age [i] + 2;}printf("the fifth student’sage is %d\n", age[4]);
}

思路2:要求第5个学生的年龄,就必须先知道第四个学生的年龄,而第四个学生的年龄也不知道,要求第四个学生的年龄必须知道第三个学生的年龄,而第3个学生的年龄又取决于第二个学生的年龄,第二个学生的年龄取决于第一个学生的年龄。而每一个学生的年龄都比其前1个学生的年龄大2。即:

    age(5) = age(4) + 2; age(4) = age(3) + 2; age(3) = age(2) + 2; age(2) = age(1) + 2; age(1) = 10;

    可以用数学公式表达如下:

        age(n)= 10; (n = 1)

        age(n)= age(n-1) + 2(n > 1)

    可以看到,当n >1时,求第n个学生的年龄的公式是相同的。因此可以用一个函数表示上述关系。图3表示求第5个学生年龄的过程。

 

                                                           图3

    显然,这是一个递归问题。由图3所示,求解可分为两个阶段:第1阶段是“回溯”,即将第n学生的年龄表示为第(n-1)个学生的函数,而第(n-1)个学生的年龄仍然还不知道,还要“回溯”到第(n-2)个学生的年龄……直到第一个学生的年龄。此时age(1)已知,不必再向前推了。然后开始第二阶段,采用递推方法,从第一个学生的已知年龄推算出第二个学生的年龄(12岁),从第二个学生的年龄推算出第三个学生的年龄(14岁)……一直推算出第5个学生的年龄(18岁)为止。也就是说,一个递归的问题可以分为“回溯”和“递归”两个阶段。要经历若干步才能求出最后的值。显而易见,如果要求递归过程不是无限制进行下去,必须具有一个结束递归过程的条件。本例中,age(1)=10,就是使递归结束的条件。

c语言代码如下:

int useRecursiveToGetAge(int n){if (n == 1) {return 10;} else {return useRecursiveToGetAge(n - 1) + 2;}
}
void main(){printf("the fifth student's age is %d\n",useRecursiveToGetAge(5));
}


例二:求n!。

    要回宿舍了,直接上代码。

//思路一:非递归
void noneRecursiveForFactorial() {int i, fac = 1;printf("please input an Integer which is large than 1\n");scanf("%d", &i);int temp = i;while(i >= 1){fac *= i;--i;}printf("the factorial value of %d is %d\n", temp, fac);
}
//思路二:递归
int useRecursiveForFactorial(int i){if (i == 1) {return 1;} else {return useRecursiveForFactorial(i - 1) * i; }
}
void main(){//noneRecursiveForFactorial();int i;printf("please input an Integer which is large than 1\n!!!");scanf("%d", &i);printf(the recursive value of %d is %d\n, i, useRecursiveForFactorial(i));
}





http://chatgpt.dhexx.cn/article/2kKuncXM.shtml

相关文章

【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;计算机…

简述Mean shift 算法及其实现

文章目录 Mean shift 是什么Mean shift 算法的预备知识什么是特征什么是特征空间什么是核密度估计核函数的表示 Mean shift 算法Mean shift算法的公式推导Mean shift算法的流程Mean shift算法图示 Mean shift 算法应用Mean Shift 算法应用在聚类Mean Shift 算法图像分割 Mean s…

Johnson-Trotter算法求全排列

下面我将贴出Johnson-Trotter算法的JAVA代码 package JT;import java.util.Scanner;public class Johnson_Trotter {//求最大的移动元素public static int maxk(int n, int[] array, boolean[] f) {//k存储最大移动元素的下标int k -1, max 0;for(int i 0; i < n; i) {/…