递归与调用【简单版】

C语言实现的猴子吃桃问题算法解决方案 主要介绍了C语言实现的猴子吃桃问题解决方案,较为详细的分析了猴子吃桃问题并给出了C语言算法的实现方法,具有一定参考借鉴价值,需要的朋友可以参考下 立即下载

递归就是自己调用自己

基本递归

题目:小猴吃桃子

一只小猴买了若干个桃子。第一天他刚好吃了这些桃子的一半,又贪嘴多吃了一个;接下来的每一天它都会吃剩余的桃子的一半外加一个。第n(n≤20)天早上起来一看,只剩下 1 个桃子了。请问小猴买了几个桃子?

#include <iostream>

using namespace std;

int n, s;

void f (int t) {
	t--;
	if (t == 0) {
		return;
	}
    //现在的s是上一天剩余的桃子除2减1
	s++;  //先加一
	s *= 2;  //再乘2
    //先s++再乘2
	f(t);  //递归部分,自己调用自己 
	return;
}

int main () {
	
	cin >> n;
	
	s = 1;  //最后一天剩1个
	f(n);  //倒推,从n开始
	
	cout << s;
	
	return 0;
}

【递归】二分算法(二分查找)

顾名思义,二分就是把一个数组折半分开

贴简单二分代码:

#include <iostream>
#include <algorithm>

using namespace std;

int n, m, x;
int a[500009];

bool f (int l, int r, int t) {
    if (l > r) {
        //没有找到
        return false;
    }
    int mid = (l + r) / 2;
    if (t < a[mid]) {
        //查找的数的大小在a[mid]左边(因为有序)
        //查找范围缩小到最左边至中间 
        return f(l, mid - 1, t);
    }
    if (t > a[mid]) {
        //查找的数的大小在a[mid]右边(因为有序)
        //查找范围缩小到中间至最右边 
        return f(mid + 1, r, t);
    }
    return true;  //剩下的情况为 t == a[mid], 查找到了
}

int main () {
    
    cin >> n;
    
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    
    //先排序(做二分算法时数组必须有序)
    sort (a + 1, a + n + 1);
    
    cin >> m;  //m组查找
    
    for (int i = 1; i <= m; i++) {
        cin >> x;
        cout << (f(1, n, x)?"YES":"NO") << endl;  //是否查找到 
    }
    
    return 0;
}

来测试几个样例~

例子:

数组大小:8

数组:

index:1,2,3,4,5,6,7,8

            [5, 1,   3,   8,  11, 14, 7, 10]

排完序:

index:1,2,3,4, 5, 6, 7,  8

            [1,3,5,7,8,10,11,14]

如果查找数为3:

        mid = (1 + 8) / 2 = 4

        a[4] = 7

        3 < 7

        return f (1, 4 - 1, 3);

                   ↓

        mid = (1 + 3) / 2 = 2;

        a[2] = 3;

        return true;

如果查找数为9

        mid = (1 + 8) / 2 = 4;

        a[4] = 7;

        9 > 7

        return f (4 + 1, 8, 9);

                   ↓

        mid = (5 + 8) / 2 = 6;

        a[6] = 10;

        9 < 10;

        return (5, 6 - 1, 9);

                ↓

        mid = (5 + 5) / 2 = 5;

        a[5] = 8;

        9 > 8;

        return f (5 + 1, 5, 9);

                ↓

        l = 6; r = 5

        l > r

        return false;

的确


【递归】快速幂

从本质上看,快速幂和二分有点(一点点)像

#include <iostream>

using namespace std;

int n, m;
long long s;
//int不行,要用long long

long long pw (int num, int t) {
	if (t == 0) {
		return 1;  //不要忘了n的零次方永远是1 
	}
    if (t == 1) {
       return num;
    }
//              也是除2,与二分相似
//                    ↑↑ ↑↑   
    long long x = pw(num, t / 2);
    if (t % 2 == 0) {
//		例如3^4中4是偶数,拆成 3 ^ 2 * 3 ^ 2 
        return x * x;
    }
//	例如3^5中5是不是偶数,拆成 3 * 3 ^ 2 * 3 ^ 2 
    return num * x * x;
}

int main () {
    
    cin >> n >> m;
    
    //求n的m次方
    
    s = pw(n, m);
    
//  m次方的值增长得非常快,2^128 = 340282366920938463463374607431768211456
//  long long也存不下呢。。。
    
    cout << s;
    
    return 0;
}

取余:

计算某些n的m次方时,可能会

所以

可以在计算过程中对s取余

long long pw (long long num, long long t) {
    if (t == 0) {
        return 1;
    }
    if (t == 1) {
        return num;
    }
    long long x = pw(num, t / 2);
    if (t % 2 == 0) {
        return (x * x) % 9223372036854775807;
    }
    return (num * x * x) % 9223372036854775807;
    //9223372036854775807为long long最大值
}

当然,也有绝妙之法的

题目:求结果

说明:

给你如下公式,请你求出下面公式的结果

答案太大了,请输出对2^64取模后的结果

输入格式:

第一行一个n,

后面n行,每行一对a[i], b[i];。

0 < n, a[i], b[i] ≤ 10^5

输出格式:

输出答案对2^64取模后的结果。

2^64连long long范围都超了

思路:

#include <iostream>

using namespace std;

long long n, a, b;
//使用unsigned long long
//↓↓↓  ↓↓↓
unsigned long long s;

long long pw (long long num, long long t) {
    if (t == 1) {
        return num;
    }
    long long x = pw(num, t / 2);
//  竟然不用取余!!!
    if (t % 2 == 0) {
        return x * x;
    }
    return num * x * x;
}

int main () {
    
    cin >> n;
    
    for (int i = 1; i <= n; i++) {
        cin >> a >> b;
        s += pw(a, b);
    }
    
    cout << s;
    
    return 0;
}

让他溢出就好

原理:

假设二进制

1,11111000,00001100,00000000,1000000,00110100,00011000,01011100,00010000

它已超出long long范围

会将其自动改成:

11111000,00001100,00000000,1000000,00110100,00011000,01011100,00010000

而省略掉的最前面的1,就代表2^64。


【递归】归并排序

说起来,归并排序的代码很

长

#include <iostream>

using namespace std;

int n;
int a[100009];
int t[100009];

void mergeSort (int l, int mid, int r) {
    int i, j, k;
    i = l; k = l;
    j = mid + 1;
    while (i <= mid && j <= r) {
        if (a[i] <= a[j]) {
            t[k++] = a[i++];
        }
        else {
            t[k++] = a[j++];
        }
    }
//  左边有剩余 ↓
    while (i <= mid) {
        t[k++] = a[i++];
    }
//  右边有剩余 ↓    
    while (j <= r) {
        t[k++] = a[j++];
    }
//  部分输出
    for (i = l; i <= r; i++) {
        a[i] = t[i];
        cout << t[i] << " ";
    }
    cout << endl;
}

void f (int l, int r) {
    if (l == r) {
        return;
    }
    int mid = (l + r) / 2;
    //分成两半 ↓
    f(l, mid);  //左
    f(mid + 1, r);  //右
    mergeSort(l, mid, r);
    return;
}

int main () {
    
    cin >> n;
    
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    
    f(1, n);
    
    for (int i = 1; i <= n; i++) {
        cout << a[i] << " ";
    }
    
    return 0;
}

细节:打架

STEP1

 STEP2

 STEP3

 STEP4

大功告成!!!

输出结果:

《QGIS快速入门与应用基础》293:色带调整与透明设置 详细讲解了QGIS中遥感影像色带调整与透明设置的核心技术,帮助用户将遥感成果从基础合成提升到专业出图标准。主要内容包括: 色带精细化调整: 多波段真/假彩色合成的优化技巧(Gamma校正、色彩平衡、色阶端点校准) 单波段栅格数据的伪彩色规范设置(行业标准色带选择与分类方法) 透明设置: 研究区黑边/白边的消除方法 多图层叠加时的透明融合技巧 特定地物的差异化半透明显示 实用建议: 提供行业标准参数模板和效果对比图 标注新手操作红线和常见问题排查 强调符合遥感行业规范的可视化要求。 阅读详情

相关推荐

华三(H3C)网络设备配置命令大全与学习指南

本文全面介绍 H3C 网络设备的配置命令,涵盖路由器、交换机、ACL、NAT、VTY、SSH、本地用户、日志、STP、防火墙、QoS 等模块,适合网络工程初学者与运维人员参考。

DreamCollector的博客 6570

函数的使用之递归调用

在前面的几篇文章中,我们了解并使用了一些函数的基本用法,但函数除了能够被主函数调用以外,其实还能被自己或是其他的函数调用,而这种特殊的用法就是我们今天讲到的——函数的递归调用。

Lin050421的博客 4934

从示波器波形看懂CAN/RS485/RS422:一个TVS管放错位置,通信全挂的教训

本文通过示波器波形分析,深入探讨了CAN/RS485/RS422通信系统中TVS管布局错误的故障诊断与解决方案。文章详细解析了错误布局导致的波形特征,如信号钳位、阻抗失配等,并提供了正确的保护电路设计方案和终端匹配技术,帮助工程师快速定位和解决通信故障。

weixin_30555515的博客 347

方法递归调用

斐波那契、猴子吃桃、迷宫问题、汉诺塔……

m0_57448314的博客 691

MATLAB App Designer 实现多窗口交互与数据传递实战

本文详细介绍了如何使用MATLAB App Designer实现多窗口交互与数据传递的实战技巧。从基础的多窗口应用设计到高级的动态窗口创建,涵盖了窗口调用控制、数据传递方法、状态管理及用户体验优化等核心内容,帮助开发者高效构建复杂的MATLAB GUI应用。

milk5的博客 666

基于STM32开发的智能语音控制系统

本文将介绍如何使用STM32微控制器开发一个智能语音控制系统,通过语音识别模块、OLED显示屏、Wi-Fi模块等实现对家用电器或其他设备的语音控制。智能语音控制系统的核心是STM32微控制器,通过语音识别模块识别用户的语音指令,并根据指令控制家用电器或其他设备。:定期测试语音识别模块、继电器控制模块、OLED显示屏和Wi-Fi模块的工作状态,确保系统能够在各种情况下正常运行,并保持智能语音控制系统的可靠性。本系统同样适用于办公环境,可以通过语音指令控制办公室设备,如照明、空调等,提供智能化的办公体验。

stm32d1219的博客 6911

函数的递归调用(零基础理解递归)

什么是递归?递归是c语言学习中一个绕不开的话题, 那什么是递归呢?递归其实就是一种解决问题的方法, 在c语言中, 递归就是函数自己调自己.main();//这里main函数又调用自己return 0;上述代码就是一个简单的递归程序, 只不过上面的递归只是为了演示递归的基本形式, 不是为了解决问题, 代码最终也会陷入死循环, 导致栈溢出 (Stack overflow).

酷酷学!!!的博客 2358

手把手教你学Simulink实例:基于Simulink的锂电池管理系统(BMS)仿真

是确保锂电池安全、高效运行的关键组件。BMS 主要功能包括监控电池的状态(如电压、电流、温度)、估算荷电状态(State of Charge, SOC)、健康状态(State of Health, SOH),以及实现电池均衡和保护机制等。Simulink 提供了一个强大的仿真环境,可以用来设计、分析和验证锂电池管理系统的控制策略。常见的均衡方法包括被动均衡(通过电阻放电)和主动均衡(通过开关电容或变压器)。通过本教程,我们详细介绍了如何使用 Simulink 进行锂电池管理系统的仿真实例。

MHD0815的博客 539

猴子吃桃 (洛谷P5743)← 递推法

一只小猴买了若干个桃子。第一天他刚好吃了这些桃子的一半,又贪嘴多吃了一个;接下来的每一天它都会吃剩余的桃子的一半外加一个。第 n 天早上起来一看,只剩下 1 个桃子了。请问小猴买了几个桃子?

hnjzsyjyj的专栏 1084

AI大模型入门到实战系列(二十一)命名实体识别(NER)

命名实体识别(NER)是自然语言处理中的关键任务,旨在从文本中识别并分类预定义类别的实体(如人名、地点、组织等)。其核心步骤包括文本预处理、实体边界检测和类型分类。主流技术方法经历了从基于规则、统计机器学习到深度学习的演进,当前主要采用预训练语言模型(如BERT)和序列标注技术(如BiLSTM-CRF)。关键技术挑战包括实体边界模糊、嵌套实体和领域适应等问题。NER广泛应用于信息抽取、搜索引擎优化和知识图谱构建等领域,常用精确率、召回率和F1值作为评估指标。实际应用中通常采用BIO标注体系,并通过标签对齐处

echo的博客 1625

禁止使用服务器 IP 访问 Apache 环境下的 Web 站点

通过在 Apache 的配置文件中添加适当的指令,我们可以轻松地禁止使用服务器 IP 地址访问我们的 Web 站点。在 Apache 环境下,有时我们希望禁止用户使用服务器的 IP 地址直接访问我们的 Web 站点,而只允许使用域名进行访问。现在,当用户尝试使用服务器的 IP 地址来访问你的网站时,他们将会被拒绝访问,只有通过域名才能正常访问。为了实现这个目标,我们可以通过 Apache 的配置文件进行相应的设置。表示禁止对根目录的访问权限,即禁止使用服务器的 IP 地址进行访问。

TpCode的博客 946

洛谷 P5743 【深基7.习8】猴子吃桃【递推/递归/数学】

https://memcpy0.blog.youkuaiyun.com/article/details/121326963

memcpy0的博客 4986

【目标检测】全局上下文感知的详解

目标检测中的全局上下文感知(Global Context Awareness)​是指模型在定位和识别目标时,能够有效利用图像中全局或大范围的上下文信息(如场景语义、目标间关系、空间布局等),而不仅仅依赖局部特征。这种能力显著提升了检测的鲁棒性,尤其是在复杂场景(如遮挡、小目标、密集目标)中表现突出。

浩瀚之水的专栏 650

递归调用简单的讲解

学过数据结构的同学应该知道,递归调用其实就是c语言的栈,及栈里的特点:先进后出的原则!! 没学过的也没关系,递归调用的实质也就是循环调用,下面我用一个简单的例子加以说明:     #include&lt;stdio.h&gt;    int main(){           int n;      int f(int m);     scanf("%d",&amp;n);     print...

weixin_34121282的博客 341

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

原来连续两次递归调用很简单

void rec(int N) { //为了区分这两个递归,分别为它们取个别名好了 if (N&gt;0){  rec(N - 1);//rec1 rec(N - 10);//rec2 } cout &lt;&lt; "N=" &lt;&lt; N &lt;&lt; endl; cout &lt;&lt; "最后一句了" &lt;&lt;

qq_31407743的博客 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

简单递归调用

问题:如何让一个数组逆序 void inverse(int *arr, int len, int idx) { if (idx == len)return; int a = arr[idx]; inverse(arr, len, idx + 1); arr[len - idx - 1] = a; } void inverse(int *arr, int len) { inverse(ar...

XBerry的专栏 234

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

java递归 JVM_玩坏JVM很简单--toString的递归调用

在JVM的内存管理机制下很少发生内存溢出的情况。至少我碰见的少,好像在SSH我多次发布项目时候出现过一次。今天看见一个特简单的方法让内存溢出(好吧,我似乎作死了--!):1 public classInfiniteRecursion {2 publicString toString(){3 return "InfiniteRecursion address : " + th...

weixin_29021757的博客 216

函数的调用以及递归的简单使用

函数的调用的使用方法

qq_58397569的博客 269

php 最简单递归调用,PHP递归调用的简单示例

这篇文章主要为大家详细介绍了PHP递归调用的简单示例,具有一定的参考价值,可以用来参考一下。感兴趣的小伙伴,下面一起跟随512笔记的小玲来看看吧!在PHP的实际编码中,当我们需要实现多元数组替换功能时,就会遇到PHP递归调用。那么具体的使用方式是怎样的呢?下面我们将通过一段代码示例来具体分析一下实现这以功能的方法。PHP递归调用实现多元数组替换功能代码示例:代码如下:< ?php$arr =...

weixin_39658019的博客 323

简单的递归调用

#include <stdio.h>int sum(int max); int main() { printf("%d\n",sum(100)); return 0; }int sum(int max) { if(max>1) { return max+sum(max-1); } else { return 1;

liuwenjunli的博客 352

对for循环里面有递归调用的理解——简单例子详细流程图解释

c++代码 #include using namespace std; void recursion(int n) { int i; for(i=1;i<=2;i++) { if (n > 0) { recursion(n - 1); cout<<n<<endl; } } } int main() { recursion(2);

IT_job的博客 6716

递归调用的简单操作

递归,就是函数在执行时自己调用自己。 首先,要使用递归,待解决的问题有如下两个要求: 原问题能分解为有限个规模更小的子问题; 最小规模的子问题的解能作为递归的出口。 这样来看的话,递归其实是可以转化为非递归的循环语句的。子问题相当于每一次循环执行的操作,递归出口则相当于循环的终止条件。 因为递归这样的特性,对刚接触C语言的新人可能会比较难以理解。 下面举一些简单的例子。 1.递归实现计算一个数...

weixin_44788162的博客 244

简单了解函数调用和函数递归

本文介绍了C语言中函数调用的三种方式:传值调用(形参修改不影响实参)、传址调用(通过地址直接操作外部变量)以及嵌套调用和链式访问(函数间相互调用或返回值作为参数)。同时阐述了函数声明(告知函数信息)与定义(具体功能实现)的区别,强调声明需在使用前完成。最后讲解了递归的概念,即程序自我调用来简化问题,指出递归必须包含终止条件和趋近条件,并以阶乘计算为例展示了递归实现过程及运行轨迹。

2502_92558048的博客 414

java 简单的递归函数_递归函数调用-简单有效

下面是个关于递归调用简单但是很能说明问题的例子:/*递归例子*/#includevoid up_and_down(int);int main(void){up_and_down(1);return 0;}void up_and_down(int n){printf("Level %d:n location %p\n",n,&n); /* 1 */if(n<4)up_and_down(...

weixin_42117267的博客 273

用Java表示简单的递归调用

/** 在链表数据结构中,我们需要使用到递归算法。 递归算法是一种直接或间接调用自身算法的过程 在计算机编写程序中,递归算法对解决一大类问题是十分有效的 它往往使算法的描述简介二易于理解 */ public class digui{ public static void main(String[] args) { int a=jiecheng(10); ...

weixin_44117272的博客 298

一个简单的递归调用

下面是一个递归调用,注意[b]arguments.callee()[/b]方法 [code="Flex4"] 0) { for each(var node:XML in xml.children()) arguments.callee(allChild,node); } } ...

shilei的专栏 152
下一篇: 洛谷P1218-[USACO1.5]特殊的质数肋骨 Superprime Rib (DFS)
Runcode8
博客等级 码龄4年 180粉丝 56原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值