C++ 递归函数 详细解析——C++日常学习随笔

1. 递归函数

1.1 递归函数的定义

  • 递归函数:即在函数体中出现调用自身的函数,即函数Func(Type a,……)直接或间接调用函数本身;

  • 递归函数:在数学上,关于递归函数的定义如下:对于某一函数f(x),其定义域是集合A,那么若对于A集合中的某一个值x0,其函数值f(x0)由f(f(x0))决定,那么就称f(x)为递归函数;

  • 递归函数:不能定义为内联函数;

1.2 递归的本质

递归函数的例子:

(1)例子一:等差数列

数列1 3 5 7 9……代码实现输入一个数n,输出数列第n项的值。

#include<iostream>
using namespace std;
int f(int n)
{
    if(n==1)
        return 1;
    else
        return f(n-1)+2;
}
int main()
{
    int n;
    cin >> n;
    cout << f(n);
    return 0;
}

解释:递归关系:f(n-1)+2,递归出口:1; 

 


(2)例子二:阶乘n!

递归的数学函数描述:
f(n)=1 (n=1)
f(n)=n*f(n-1) (n>1)
递归的C++函数描述:
int f(nt n)
{
    if(n==1) 
        return 1;
    return n*f(n-1);
}

注:由于f(13)>2^32。所以对于int型(无符号类型)的表示范围,其n的取值范围只有1<=n<=12了。

(3)例子3:Fibonacci数列

斐波那契数列:1,1,2,3,5,8,13,21,34,55,89…

递归的数学函数描述:
f(n)=0 (n=0)
f(n)=1 (n=1)
f(n)=f(n-1)+f(n-2) (n>2)
递归的C++函数描述:
int f(int n)
{
    if((n==0) || (n==1))
        return n;
    return f(n-1)+f(n-2) ;
}
#include<iostream>
using namespace std;
int f(int n)
{
    if(n==1||n==2)
        return 1;
    else
        return f(n-1)+f(n-2);
}
int main()
{
    int n;
    cin>>n;
    cout<<f(n);
    return 0;
}

(4)例子4:王小刀切饼:

王小二自夸刀工不错,有人放一张大的煎饼在砧板上,问他:“饼不许离开贴板,切n(1<=n<=100)刀最多能分成几块?

输入格式:输入切的刀数n

输出格式:输出切n刀最多切的块数

#include<iostream>
using namespace std;
int f(int n)
{
    if(n==1)
        return 2;
    else
        return f(n-1)+n;
}
int main()
{
    int n;
    cin>>n;
    cout<<f(n);
    return 0;
}

解释:递归关系:f(n-1)+n,递归出口:n=1;

先列举几项就会发现规律

第一刀2

第二刀2+2=4

第三刀 4+3=7

第四刀 7+4=11

……

第n-1刀 i

第n刀 i+n

如图

(5)例子5:杨辉三角

#include<iostream>
using namespace std;
int f(int x,int y)
{
    if(y==0||x==y)
        return 1;
    else
        return f(x-1,y-1)+f(x-1,y);
}
int main()
{
    int x,y;
    cin>>x>>y;
    cout<<f(x,y);
    return 0;
}

(6)例子6:最大公约数 

#include<iostream>
using namespace std;
int gcd(int a,int b)
{
    int r=a%b;
    if(r==0) return b;
    return gcd(b,r);
}
int main()
{
    int m,n;
    cin>>m>>n;
    cout<<gcd(m,n);
    return 0;
}

解释:

辗转相除法又名欧几里得算法,目的是求出两个正整数的最大公约数。它是最古老的算法,其可追溯刀公元前300年前。

这条算法基于一个定理:两个正整数a和b(a>b),他们的最大公约数等于a除以b的余数c和较小数b之间的最大公约数。

 

  • 递归有直接递归和间接递归之分:
  1. 直接递归:直接调用函数本身;
  2. 间接递归:指函数体中没有直接调用自身函数,而是调用了另一个函数,在那个函数里,出现了调用本函数的语句。或者,在那个函数里,又调用了一个其他函数,反复出现调用其它函数,而最后有一个函数调用了本函数;
  3. 注:递归函数在运行中,其调用与被调用函数的指令代码是同一个函数副本,只不过各个不同运行中的调用点作为状态的一部分,在栈中被分别保护了起来。因此,是C++的函数机制决定了递归操作中的数据独立性,因而使递归调用成为可能。

1.3 递归条件

  • 递归不能无限制地调用下去,因为栈空间是有限的。所以递归函数是有条件地调用自身,该条件就是递归的停止条件;
  • 递归函数中必须有完成终极任务的语句序列(如:return 1;),以使函数有意义,递归调用,并非终极;
  • 递归函数当然有递归调用语句,递归调用应有参数,而且参数值应该是逐渐逼近停止条件;
  • 递归条件应先测试,后递归调用,无条件递推的逻辑错误,编译器是检查不出来的,要靠程序员自己把握;
  • 注:消去递归,即大多数递归函数都能用非递归函数来替代,一般用循环语句实现。 

1.4 递归函数的优缺点

优点:

  • 简化程序设计,使程序易读;
  • 作为对特殊问题的一种处理方法,递归仍然占有一席之地;
  • 许多高难算法的简捷描述,往往采用递归,特别对于能较快逼近停止条件的、优化了的递归函数;
  • 递归在迅速退栈的技术处理上得到了异常机制的帮助;

缺点:

  • 递归会迅速递增系统开销;
  • 在时间上,执行函数的调用与返回的次数明显要大于非递归函数;
  • 在空间上,栈空间资源会遭到空前的劫掠,随着每递归一次,栈内存就会多占用一截;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/283857.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探秘HyperLogLog:Redis中的基数统计黑科技

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 探秘HyperLogLog&#xff1a;Redis中的基数统计黑科技 前言HyperLogLog简介基数和基数统计的重要性HyperLogLog的历史和革命性 HyperLogLog的工作原理哈希函数线性计数与对数计数HyperLogLog的核心算法…

[情商-2]:理解情商最关注的要素 - 情绪,情绪,情绪,不是事情本身,不是逻辑推理,不是讲道理

前言&#xff1a; 情商最关注的要素是情绪&#xff0c;他人的情形&#xff0c;自己的情绪&#xff0c;情绪是一个完全不同于技术人员经常关注的逻辑推理、问题解决。对于技术人员而言&#xff0c;它是一个完全不同的领域&#xff0c;有着不同的行为模式。 因此&#xff0c;在…

Android端SpyNote恶意软件技术层面深度剖析

内容概述&#xff1a; 当前的Android生态环境中充斥着各种类型的恶意软件&#xff0c;每一款恶意软件都有其自己独特的一面。在大多数情况下&#xff0c;它们的目标都是窃取用户数据&#xff0c;然后将其出售以换取金钱。但某些恶意软件则可以被归类为间谍软件&#xff0c;因为…

【操作系统】 文件管理

文件管理概述 文件管理的对象&#xff1a;计算机中的程序和数据。 文件管理的主要任务&#xff1a;利用文件系统把所管理的程序和数据组织成一系列文件&#xff0c;并把文件的存取、共享和保护手段提供给用户。 文件管理的主要功能包括&#xff1a;外存的分配 目录管理 存储…

论文阅读——SG-Former

SG-Former: Self-guided Transformer with Evolving Token Reallocation 1. Introduction 方法的核心是利用显著性图&#xff0c;根据每个区域的显著性重新分配tokens。显著性图是通过混合规模的自我关注来估计的&#xff0c;并在训练过程中自我进化。直观地说&#xff0c;我们…

【已解决】若依系统前端打包后,部署在nginx上,点击菜单错误:@/views/system/role/index

​ 上面错误&#xff0c;是因为/views/system/role/index动态路由按需加载时候&#xff0c;错误导致。 解决办法&#xff1a; 如果您的前端项目访问时候&#xff0c;需要带有项目名称的话&#xff0c;参考凯哥上一篇文章&#xff1a;【已解决】若依前后端分离版本&#xff0…

Springboot整合Elasticsearch 7.X 复杂查询

这里使用Springboot 2.7.12版本&#xff0c;Elasticsearch为7.15.0。 导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency> yaml文件配置…

<软考高项备考>《论文专题 - 37 采购管理(1) 》

1 成本管理基础 1.1 写作要点 过程定义、作用写作要点、思路规划采购管理规划采购管理是记录项目采购决策、明确采购方法&#xff0c;及识别潜在卖方的过程。作用:确定是否从项目外部获取货物和服务&#xff0c;如果是&#xff0c;则还要确定将在什么时间、以什么方式获取什么…

Nginx 代理静态资源,解决跨域问题

&#x1f602; 背景&#xff1a;移动端 H5 项目&#xff0c;依赖了一个外部的 JS 文件。访问时&#xff0c;出现跨域&#xff0c;导致请求被 block。 当前域名&#xff1a;https://tmcopss.test.com要访问的 JS 文件&#xff1a;https://tm.test.com/public/scripts/y-jssdk.j…

大数据概念:数据网格和DataOps

数据网格&#xff08;Data Mesh&#xff09; 一种新型的数据架构模式&#xff0c;旨在解决传统数据架构中存在的一些问题&#xff0c;例如数据孤岛、数据冗余、数据安全等。数据网格将数据作为一种服务&#xff0c;通过在分布式环境中提供数据服务&#xff0c;实现数据的共享和…

gem5学习(8):创建一个简单的缓存对象--Creating a simple cache object

目录 一、SimpleCache SimObject 二、Implementing the SimpleCache 1、getSlavePort() 2、handleRequest() 3、AccessEvent() 4、accessTiming() &#xff08;1&#xff09;缓存命中&#xff1a;sendResponse() &#xff08;2&#xff09;缓存未命中&#xff1a; 三、…

1-Linux-基础

文章目录 Linux基础知识操作系统基础知识Linux基础知识Linux系统的组成Linux系统图示Linux发行版 Linux基础命令Linux系统的目录结构目录结构对比&#xff1a;windows路径描述方式 Linux命令入门Linux命令通用格式入门命令示例&#xff1a;ls 目录切换【命令】路径&#xff1a;…

11 HAL库的硬件I2C驱动SI7006和AP3216C

引言&#xff1a; 本片文章想给大家分享一下使用HAL库驱动SI7006和AP3216C&#xff0c; 这两款常见的芯片的手册会在文章的末尾提供给大家。 一、SI7006和AP3216C简介 SI7006 SI7006是一款数字湿度和温度传感器&#xff0c;由Silicon Labs&#xff08;全称Silicon Laboratories…

C语言之scanf浅析

前言&#xff1a; 当有了变量&#xff0c;我们需要给变量输入值就可以使用scanf函数&#xff0c;如果需要将变量的值输出在屏幕上的时候可以使用printf函数&#xff0c;如&#xff1a; #include <stdio.h> int main() {int score 0;printf("请输⼊成绩:");sc…

数据结构——红黑树 and B-树

红黑树 根据平衡条件第4、5两点 最短路径&#xff0c;都是黑色 最长路径&#xff0c;红黑相间 最长是最短的两倍 B-树

webpack的深入学习与实战(持续更新)

一、何为Webpack Webpack是 一个开源的JavaScript模块打包工具&#xff0c;其最核心的功能是解决模块之间的依赖&#xff0c;把各个模块按照特定的规则和顺序组织在一起&#xff0c;最终合并为一个JS文件或多个。 二、带宽的换算 目前我们的云服务器带宽为5M 三 、bundle 体…

小白入门java基础-注解

一&#xff1a;介绍 Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的高级程序设计语言。 Java 可运行于多个平台&#xff0c;如 Windows, Mac OS 及其他多种 UNIX 版本的系统。Java语言编写的程序&#xff0c;在一次编译后&#xff0c;可以在多个系统平台上运行。 主…

一元函数微分学——刷题(8

目录 1.题目&#xff1a;2.解题思路和步骤&#xff1a;3.总结&#xff1a;小结&#xff1a; 1.题目&#xff1a; 2.解题思路和步骤&#xff1a; 先看A&#xff0c;既然存在&#xff0c;那么f(x)和x属于同阶无穷小&#xff0c;所以f(0)0&#xff0c;没问题 再看C&#xff0c;结…

数据结构,题目笔记

哈希表 线性探测再散列 【算法数据结构&#xff5c;哈希查找&#xff5c;哈希冲突&#xff5c;除留余数法&#xff5c;线形探测法&#xff5c;例题讲解】https://www.bilibili.com/video/BV1514y1P7BK?vd_source1a684a3a1b9d05485b3d6277aeeb705d 【二次探测再散列法】 【【…