最大公约数算法 辗转相除法解析
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两条定义)。
这是从定义来了解递归的方式。
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两条定义)。
这是从定义来了解递归的方式。
相关文章推荐
- IT上的本地化理解
- wince开发_摩托罗拉MC3100_打开条码设置
- 第一章
- C 语言标准输入输出函数的 函数定义 (stdio.h)
- IOS数组
- poj1011(dfs+目前做的最好的剪枝)
- HTML5新标签含义,用法及其与HTML4的区别
- WPF(VB.NET) ImageSource 转 System.Drawing.Image
- stanford parser 使用说明
- HDU -- 3605 Escape(最大流 状态合并判满流)
- 数组排序问题的两种方法:插入排序算法和递归(分治)算法
- html基本常识
- html、htm、shtml、shtm的区别
- PAT乙级 1004. 成绩排名
- mfc 子对话框数据传给父对话框
- 甲骨文官方文档,keytool使用方法, 要学习的看这个很全很权威;主要命令实录;
- 三目表达式
- java面向对象的思想
- 17_Android中Broadcast详解(有序广播,无序广播)最终广播,Bundle传递参数,传递参数的时候指定权限
- 17_Android中Broadcast详解(有序广播,无序广播)最终广播,Bundle传递参数,传递参数的时候指定权限