您的位置:首页 > 其它

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

2015-07-11 23:10 337 查看
辗转相除法代码:

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两条定义)。
这是从定义来了解递归的方式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: