【递归】递归求n个数中的最大值

简介: 【递归】递归求n个数中的最大值

⭐题目(代码😇在文末)

使用递归求 55 ,22, 155, 77, 99这5个数中的最大值

⭐递归思想

36c853a50ef9481c97a66e740ec446a1.png


🎈Q: 什么是递归?

A1:我们学过函数,知道了函数调用,函数调用就是一个函数调用其他函数,比如主函数调用求两个数之和。

A2:递归就是一个函数调用自身,例如主函数调用主函数(这就是最简单的函数递归,但是会造成死循环,不建议这末做)

#include<stdio.h>
int main()
{
  printf("我现在知道递归是什么了");
  main();
  return 0;
}

死循环了,代码如下:

5c798f4899564ec488665b7b1ded6b91.png

🎈递归递归:有递有归,先递后归

以4的阶乘为例:

4!

递:4 递:3 递:2 递;1

归:1 归:2 归:6 归;24

🎈 利器1:递推公式(数学公式)

c9a70c83054241b4b2a666a23ed60da1.png


🎈利器2:递推栈图:



fe7d62f400184f1888f215776ee157a5.png


🎈利器三:把求解的任务重复(大问题化为类似的子问题)

递归出口:最后一次递归,此时的函数值是可以直接算出,不需要递归求得,递归出口往往是边界的时候

不断递归:每递归一次,下一次需要递归就会逐渐靠近这个递归出口

同时递归的开始的时候我们要把要递归的当成我们已知的,进行操作,如递归求n的阶乘为例,我们就假设n-1的递归值是已知的。


备注:递推必须要有递推出口


⭐求前n个斐波那契数

🎈具体代码:

#include<stdio.h>
int fabo(int n)
{
  if (n == 1 || n == 2)
  {
    return 1;
  }
  return fabo(n - 1) + fabo(n - 2);
}
int main()
{
  //递归求斐波那契数列的前50项的和
  int i = 0;
  for (i = 1; i <51;i++)
  {
    printf("%d\t", fabo(i));
  }
  return 0;
}


⭐具体代码(答案😇)


🎈递归出口:当数组只有一个元素

不断递归:那么我们就可以反向的推出:应该从数组下标大的一端开始递归,且把任务一步一步向递归出口逼近,同时调用自身。

🎈往里套用就是:

关键:重复把求最大值这个过程重复再重复,知道找到递归出口


1.当数组只有一个元素的时候,这个数就是最大值

2.但是当n>1时,从数组下标大的一端开始自身调用**,将最后一个数和n-1个数中的最大值进行比较(假设我们已知)**

3.然后就是求n-1个数中的最大值,也就是重复了以上的步骤

4.知道我们到了递归出口,再归回去就可以了。

#include<stdio.h>
int find_max(int* a, int n)
{
  if (n == 1)
  {
    return a[0];
  }
    return a[n - 1] > find_max(a, n - 1) ? a[n - 1] : find_max(a, n - 1);
}
int main()
{
  //递归求n个数中的最大值
  int a[5] = { 55,22,155,77,99 };
  int ret=find_max(a, sizeof(a) / sizeof(a[0]));
  printf("%d\n", ret);
  return 0;
}

运行结果:da30981be5e74922952c3a04fe5890ec.png

最后,到这里就结束了,码字不易,耗时耗力,欢迎三联一波。🙌🙌🙌

❤️关注我一起成长 ❤️



目录
相关文章
|
9月前
|
存储 算法 C++
【C++数据结构——查找】二分查找(头歌实践教学平台习题)【合集】
二分查找的基本思想是:每次比较中间元素与目标元素的大小,如果中间元素等于目标元素,则查找成功;顺序表是线性表的一种存储方式,它用一组地址连续的存储单元依次存储线性表中的数据元素,使得逻辑上相邻的元素在物理存储位置上也相邻。第1次比较:查找范围R[0...10],比较元素R[5]:25。第1次比较:查找范围R[0...10],比较元素R[5]:25。第2次比较:查找范围R[0..4],比较元素R[2]:10。第3次比较:查找范围R[3...4],比较元素R[3]:15。,其中是顺序表中元素的个数。
300 68
【C++数据结构——查找】二分查找(头歌实践教学平台习题)【合集】
|
10月前
|
算法 C语言 C++
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
305 7
|
弹性计算 缓存 监控
基于“日志审计应用”的 DNS 日志洞察实践
DNS 解析日志是一种记录 DNS 请求和响应的基础信息,监控 DNS 服务可以帮助用户识别网络活动并保持系统安全。日志审计服务支持采集 DNS 内网解析日志、公网权威解析日志、GTM 日志。理解 DNS 日志的字段含义,洞察 DNS 日志背后所代表的网络信息,既可以帮助发现和诊断 DNS 解析相关的问题,还可以检测和识别潜在的安全威胁。
8748 117
|
12月前
|
SQL 存储 缓存
SQL计算班级语文平均分:详细步骤与技巧
在数据库管理和分析中,经常需要计算某个班级在特定科目上的平均分
|
监控 数据挖掘 数据安全/隐私保护
ERP系统中的绩效管理与考核
【7月更文挑战第25天】 ERP系统中的绩效管理与考核
568 2
Tortoisegit的贮藏
省去强制覆盖的烦恼
806 0
|
存储 编解码 数据库
【C++ 包装器类 std::tuple】全面入门指南:深入理解并掌握C++ 元组 std::tuple 的实用技巧与应用(二)
【C++ 包装器类 std::tuple】全面入门指南:深入理解并掌握C++ 元组 std::tuple 的实用技巧与应用
394 0
|
Ubuntu
解决Ubuntu 2022 IDEA 不能输入中文
解决Ubuntu 2022 IDEA 不能输入中文
1237 0
|
存储 监控 安全
保护企业财产:ERP系统的安全与数据保护策略
保护企业财产:ERP系统的安全与数据保护策略
929 0
|
C++
C/C++判断字符串是否为另一字符串的子字符串
C/C++判断字符串是否为另一字符串的子字符串
298 0