Exercise 1.20 最大公约数算法

The process that a procedure generates is of course dependent on the rules used by the interpreter. As an example, consider the iterative gcd procedure given above. Suppose we were to interpret this procedure using normal-order evaluation, as discussed in section 1.1.5. (The normal-order- evaluation rule for if is described in exercise 1.5.) Using the substitution method (for normal order), illustrate the process generated in evaluating (gcd 206 40) and indicate the remainder operations that are actually performed. How many remainder operations are actually performed in the normal- order evaluation of (gcd 206 40)? In the applicative-order evaluation?

采用Applicative-order

gcd(206, 40)

=gcd(40, 6)

=gcd(6,4)

=gcd(4,2)

=gcd(2,0)

共4次递归,因此,采用Applicative-order,Remainder函数被调用4次。

采用Normal-order

gcd(206, 40)

=gcd( 40, R(206,40)) //这里判断R(206,40)是否为零,有一次Remainder计算

=gcd(

R(206,40),

R(40, R(206,40))

)//这里判断R(40, R(206,40))是否为零,有两次Remainder计算

=gcd(

  R(40, R(206, 40)),

R(

R(206,40),

R(40, R(206, 40))

)//判断是否为零,有4次Remainder计算

)

=gcd(

R(

R(206,40),

R(40, R(206, 40))

),//返回结果,有4次计算

R(

R(40, R(206, 40)),

R(

R(206,40),

R(40, R(206, 40))

),

)//判断是否为零,有7次Remainder计算

)

总共有1+2+4+7=14次Remainder调用计算

时间: 2024-10-09 12:12:36

Exercise 1.20 最大公约数算法的相关文章

二进制最大公约数算法

求最大公约数的Euclid算法需要用到大量的取模运算,这在大多数计算机上是一项复杂的工作,相比之下减法运算.测试数的奇偶性.折半运算的执行速度都要更快些. 二进制最大公约数算法避免了Euclid算法的取余数过程. 二进制最大公约数基于下述事实: 若a.b都是偶数,则gcd(a,b)=2*gcd(a/2,b/2) 若a是奇数.b是偶数,则gcd(a,b)=gcd(a/2,b/2) 若a.b都是奇数,则gcd(a,b)=gcd((a-b)/2,b) 因此可写出二进制最大公约数算法如下(C语言版):

最大公约数算法

看到一个比较精炼的最大公约数算法: public static int gcd(int a, int b){ return b==0 ? a : gcd(b, a % b); }

OpenCV学习(20) grabcut分割算法

http://www.cnblogs.com/mikewolf2002/p/3330390.html OpenCV学习(20) grabcut分割算法 在OpenCV中,实现了grabcut分割算法,该算法可以方便的分割出前景图像,操作简单,而且分割的效果很好.算法的原理参见papaer:“GrabCut” — Interactive Foreground Extraction using Iterated Graph Cuts 比如下面的一副图,我们只要选定一个四边形框,把框中的图像作为gra

菜鸟学算法--简单的交换和最大公约数算法入门篇

工作之后我们大部分的时间实在研究如何如何学习一门语言 如何如何掌握一门技术,但是作为编程的本质 数据结构和算法 我们慢慢的忽略了 . 工作后的很多程序员真的没有大学生一样的时间 去静下心来去增加自己的底蕴,这是我深有体会的事情当然我这里指的是和我有累死感觉的人. 学习是一个过程,从简入繁 一贯如此,记录下来只为 记录自己的点点滴滴. 算法的本质并不是我们程序员去创造算法 而是我们 按照先人创造的算法思想 用代码来实现算法. 下面开始介绍两个 简单的例子 一个是交换 一个是最大公约数算法. 简单的

【视频】20个常用算法视频讲解

20个常用算法 视频网址: http://www.qghkt.com/ 20个常用算法视频地址: https://ke.qq.com/course/309464?tuin=a508ea62 目  录一.查找算法... 21.1.顺序查找... 21.2.折半查找... 41.3.哈希查找... 7二.字符串算法... 132.1.求字符串长度... 132.2.字符串拷贝... 152.3.字符串比较... 152.4.字符串模式匹配... 162.4.1.布鲁特-福斯算法... 162.4.2

公约数算法

/* 对于已知的两个自然数m, n,假设m>n 计算m除以n,将得到的余数记做r 如果r=0,则此时的n为求得的最大公约数.否则,将n的值保存在m中,将r的值保存在n中, 重复执行下去. */ //欧几里得->辗转相除法 #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <iostream> #include &l

《转》两种最大公约数算法

1.辗转相除法 辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法.例如,求gcd(319,377):∵ 377÷319=1(余58)∴gcd(377,319)=gcd(319,58):∵ 319÷58=5(余29),∴ gcd(319,58)=gcd(58,29):∵ 58÷29=2(余0),∴ gcd(58,29)= 29:∴ gcd(319,377)=29. 2. 更相减损法: 更相减损术,是出自<九章算术>的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需

Summary: gcd最大公约数算法

欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数.其计算原理依赖于下面的定理: 定理:gcd(a,b) = gcd(b,a mod b) 证明:a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r 因此d是(b,a mod b)的公约数 假设d 是(b,a mod b)的公约数,则 d | b , d |r ,但是a = kb +r 因此d也是(a,b)的公约数 因此(a,b

常用的20种经典算法及其应用

1.冒泡排序 技术要点:这个过程很简单,就是首先将第一条记录的关键字和第二个关键字进行比较,要是为逆序,则将数据交换,然后就是第二个和第三个,以此类推.直至第N-1个记录和N个记录的关键字进行过比较为止. static void Main(string[] args) { //冒泡排序 BubbleSorter b = new BubbleSorter(); int[] list = {2,55,44,21,35,62,22,41,14,28,95,100 }; b.Sort(list); fo