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;elsereturn 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;elsereturn 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;elsereturn 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;elsereturn 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 递归函数的优缺点

优点:

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

缺点:

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ssm基于web的马病管理系统设计与实现+jsp论文

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;马病信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广大…

RK3568测试tdd

RK3568测试tdd 一、门禁取包二、烧录三、跑tdd用例四、查看结果参考资料 一、门禁取包 右键复制链接&#xff0c;粘贴下载&#xff1b;解压到文件夹&#xff1b; 二、烧录 双击\windows\RKDevTool.exe打开烧写工具&#xff0c;工具界面击烧写步骤如图所示&#xff1a; 推荐…

动态规划 典型例题

总结 动态规划的的四个解题步骤是&#xff1a; 定义子问题写出子问题的递推关系确定 DP 数组的计算顺序空间优化&#xff08;可选&#xff09; from functools import cache cache #缓存&#xff0c;避免重复运算 def dfs(i)->int:if 终止: return 0 #具体返回什么值要看…

C# 图标标注小工具-查看重复文件

目录 效果 项目 代码 下载 效果 项目 代码 using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Windows.Forms;namespace ImageDuplicate {public partial clas…

使用Go处理HTTP GET请求

你是否曾经想过&#xff0c;当你点击一个链接或在浏览器中输入一个网址时&#xff0c;背后发生了什么&#xff1f;其实&#xff0c;这是一个小小的数据冒险之旅。而今天&#xff0c;我们将使用Go语言作为我们的冒险伙伴&#xff0c;一起去探索如何处理HTTP GET请求的神秘世界&a…

2023年度总结—你是你的年度MVP吗?

这段年度总结其实我之前就想写了&#xff0c;大概就是市赛比完之后18号的样子把&#xff0c;但是因为太懒了就一直拖到了现在哈哈&#xff0c;我思来想去&#xff0c;翻来覆去&#xff0c;彻夜难眠&#xff0c;想了想&#xff0c;还是决定把它写了吧&#xff01;毕竟&#xff0…

「微服务」微服务架构中的数据一致性

在微服务中&#xff0c;一个逻辑上原子操作可以经常跨越多个微服务。即使是单片系统也可能使用多个数据库或消息传递解决方案。使用多个独立的数据存储解决方案&#xff0c;如果其中一个分布式流程参与者出现故障&#xff0c;我们就会面临数据不一致的风险 - 例如在未下订单的情…

2024 GMF|The Sandbox 为创作者赋能的新时代

以新的 GMF 模型和专门的参与池奖励来开启 2024 年吧。 11 月 3 日&#xff0c;我们在香港全球创作者日上宣布&#xff0c;The Sandbox 已为所有创作者分配了100,000,000 SAND&#xff0c;将通过 GMF 进行分发。作为首次启动的建设者挑战&#xff0c;我们准备了专门的 SAND 参与…

2023 全球 AI 大事件盘点

本文来自微信公众号硅星人

美团到店终端从标准化到数字化的演进之路

总第580篇 | 2023年第032篇 本文整理自美团技术沙龙第76期《大前端研发协同效能提升与实践》。前端团队在产研多角色协同形式上存在不同阶段&#xff0c;而大前端多技术栈在各阶段都有其独特的实践&#xff0c;同时又有类似的演进路线。本文从到店终端团队移动端和前端技术栈持…

vue3引入百度地图(两种方法)

首先要有百度开放平台并进行注册&#xff0c;不懂看这里 ### 第一种方法 地图引入流程 安装vue-baidu-map-3x插件 参考官网地址&#xff1a;快速上手 | vue-baidu-map-3x npm install vue-baidu-map-3x --save 在public/index.html文件中引入 <!-- 百度地图 --> &…