
最大公约数(递归)(c++)
发布日期:2021-05-15 08:58:15
浏览次数:16
分类:精选文章
本文共 1257 字,大约阅读时间需要 4 分钟。
递归是计算最大公约数的有效方法,基于欧几里得算法的原理。它通过不断交换参数,直到余数为零,从而找到最大公约数。以下是详细的解释和优化后的代码。
递归求最大公约数的步骤解析
当调用函数 dg(a, b)
时,参数分别为两个正整数a和b:
检查条件:首先判断a是否能被b整除,即 a % b == 0
。
- 如果可以,那么b就是a和b的最大公约数,直接返回b。
- 否则,返回
dg(b, a % b)
。
递归调用:在没有满足条件的情况下,函数调用自身,将a和b替换为b和a % b,然后重复上述过程。
这里是关键:每次递归调用都会减少较大的数,这是欧几里得算法的本质。通过不断地用较大的数除以较小的数,余数越来越小,直到余数为零。
优化后的C++代码
#include#include using namespace std;int dg(int a, int b) { if (b == 0) { return a; } return dg(b, a % b);}int main() { int a, b; cout << "请输入两个整数:"; cin >> a >> b; sort(a, b); // 确保a >= b以简化计算 cout << dg(a, b) << endl; return 0;}
分步解释代码和逻辑
-
递归函数
dg(a, b)
:- base case:当
b == 0
时,直接返回a,因为a已经是和b的最大公约数了。 - 递归 case:返回
dg(b, a % b)
,即调用自身,更新参数为新的b和a % b。
- base case:当
-
主函数
main()
:- 读取两个整数a和b。
- 调用
sort(a, b)
确保a是较大的数,b是较小的数,以简化递归过程。 - 调用递归函数
dg(a, b)
并输出结果。
示例运行
假设输入两个数为24和36:
初始调用:dg(24, 36)
- 检查b是否为0?36 != 0,继续。
- 调用
dg(36, 24 % 36)
,即dg(36, 24)
第二次调用:dg(36, 24)
- 检查b是否为0?24 != 0,继续。
- 调用
dg(24, 36 % 24)
,即dg(24, 12)
第三次调用:dg(24, 12)
- 检查12是否为0?不是,继续。
- 调用
dg(12, 24 % 12)
,即dg(12, 0)
第四次调用:dg(12, 0)
- 检查b是否为0?是的,返回a的值,也就是12。
最终输出最大公约数12。
KLARωσηgle-Trouble Sheldon的讲解
递归的过程简化了多次模运算,随着每次递归,数值被有效减少,直到余数为零,最后返回结果。这个过程在技术和教育领域都有广泛应用。
通过这种优化,代码变得更加有效率,而递归过程亦更易于理解和调试。这种方法不仅展示了递归的强大,但也证明了欧几里得算法的逻辑严密性。
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年04月09日 17时11分55秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Struts2-从值栈获取list集合数据(三种方式)
2019-03-08
vscode中快速生成vue模板
2019-03-08
参考图像
2019-03-09
设计模式(18)——中介者模式
2019-03-09
推荐几篇近期必看的视觉综述,含GAN、Transformer、人脸超分辨、遥感等
2019-03-09
BUU-MISC-认真你就输了
2019-03-09
BUU-MISC-caesar
2019-03-09
【专题2:电子工程师 之 上位机】 之 【36.事件重载】
2019-03-09
【专题3:电子工程师 之 上位机】 之 【46.QT音频接口】
2019-03-09
一文理解设计模式--命令模式(Command)
2019-03-09
VTK:可视化之RandomProbe
2019-03-09
block多队列分析 - 2. block多队列的初始化
2019-03-09
Java时间
2019-03-09
不编译只打包system或者vendor image命令
2019-03-09
The wxWindows Library Licence (WXwindows)
2019-03-09
leetcode——第203题——虚拟头结点
2019-03-09
【编程】C语言入门:1到 100 的所有整数中出现多少个数字9
2019-03-09