最大公约数算法 辗转相除法解析


辗转相除法代码:
int f(int a,int b)
{
    if(b == 0) return a;
    int c = a % b;
    return f(b,c);

}

一、堆栈调用

示例:

f(12,18)

f(18,12)

f(12,6)

f(6,0)

6

上面的调用直接展示了该算法的思路。

二、最大公约数的辗转相除算法描述

辗转相除法的基本原理是:两个数的最大公约数等于它们中较小的数和两数之差的最大公约数。

当“两数之差”依然大于较小的数时,又会用同样的数据再次计算这个过程,所以实际使用取余操作。

新的更为精简的定义(红字):

1.两个数的最大公约数等于它们中较小的数和两数取余结果的最大公约数。

2.任何数和0的最大公约数是他本身。(不明显的已知条件)



三、算法的递归描述
声明:f函数传入两个参数,返回最大公约数。
1)对 定义1. 的实现(不考虑产生0):为了遵循定义,假设a>b。
那么对 定义1. 的一个直接的翻译是:
f1(x,y) = f1(x,x%y); 
2)对 定义2 的实现:f2(n,0)=n

因为f1和f2都能求出最大公约数,所以他们是一个函数,可以统一成f表示,但这时候也需要统一变量。
新的对1的实现:f(a,b)=f(a,a%b);
新的对2的实现:f(a,b)=a(其中b==0)
将上面两个表达式放在一起:
f(a,b)={
    if(b==0)
        return a;
    return f(a,a%b);
}
从代码的角度解释,两个return都能返回最大公约数,他们是的关系是并列的(并列指的是它们基于二、中的1,2两条定义)。
这是从定义来了解递归的方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值