求最大公约数,一个逐步消除递归的例子。

2024-05-15 18:08

本文主要是介绍求最大公约数,一个逐步消除递归的例子。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

算法 stein www.cnblogs.com/drizzlecrj/archive/2007/09/14/892340.html


int gcd (int a, int b) // a,b>=0
{if(a==0) return b;if(b==0) return a;if( ((a&1)==0) && ((b&1)==0) ) {return gcd(a>>1,b>>1)<<1;		}else if((a&1)==0) {a>>=1;}else if((b&1)==0) {b>>=1;}return gcd(abs(a-b),min(a,b));
}


尾递归(就是return 函数本身;)能 很容易地 改成 循环。

return gcd(abs(a-b),min(a,b)); 是尾递归

return gcd(a>>1,b>>1)<<1; 不是尾递归,因为返回的不是函数本身,而是包含它的表达式,这样也不构成 尾递归。

于是得 把它改成 尾递归。如何改?只能更改递归的“接口”了。


int gcd2(int a, int b, int multiple) // 求a b的最大公约数的multiple倍
{if (a == 0) return b*multiple;if (b == 0) return a*multiple;if (((a & 1) == 0) && ((b & 1) == 0)) {return gcd2(a >> 1, b >> 1, multiple << 1);}else if ((a & 1) == 0) {a >>= 1;}else if ((b & 1) == 0) {b >>= 1;}return gcd2(abs(a - b), min(a, b), multiple);
}
如上,已成 尾递归。把尾递归 改为 循环,先 用 goto 代替。
int gcd3(int aa, int bb)
{int a = aa;int b = bb;int multiple = 1;loop:if (a == 0) return b*multiple;if (b == 0) return a*multiple;if (((a & 1) == 0) && ((b & 1) == 0)) {a >>= 1;b >>= 1;multiple <<= 1;goto loop;}else if ((a & 1) == 0) {a >>= 1;}else if ((b & 1) == 0) {b >>= 1;}if (a > b) {a = a - b;}else {b = b - a;}goto loop;
}

把 goto 改写成 while 循环。

int gcd4(int aa, int bb)
{int a = aa;int b = bb;int multiple = 1;while (a&&b){if (((a & 1) == 0) && ((b & 1) == 0)) {a >>= 1;b >>= 1;multiple <<= 1;continue;}else if ((a & 1) == 0) {a >>= 1;}else if ((b & 1) == 0) {b >>= 1;}if (a > b) {a = a - b;}else {b = b - a;}}if (a == 0) return b*multiple;else return a*multiple;
}



这篇关于求最大公约数,一个逐步消除递归的例子。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/992547

相关文章

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

python中update()函数的用法和一些例子

《python中update()函数的用法和一些例子》update()方法是字典对象的方法,用于将一个字典中的键值对更新到另一个字典中,:本文主要介绍python中update()函数的用法和一些... 目录前言用法注意事项示例示例 1: 使用另一个字典来更新示例 2: 使用可迭代对象来更新示例 3: 使用

python连接sqlite3简单用法完整例子

《python连接sqlite3简单用法完整例子》SQLite3是一个内置的Python模块,可以通过Python的标准库轻松地使用,无需进行额外安装和配置,:本文主要介绍python连接sqli... 目录1. 连接到数据库2. 创建游标对象3. 创建表4. 插入数据5. 查询数据6. 更新数据7. 删除

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda

mysql递归查询语法WITH RECURSIVE的使用

《mysql递归查询语法WITHRECURSIVE的使用》本文主要介绍了mysql递归查询语法WITHRECURSIVE的使用,WITHRECURSIVE用于执行递归查询,特别适合处理层级结构或递归... 目录基本语法结构:关键部分解析:递归查询的工作流程:示例:员工与经理的层级关系解释:示例:树形结构的数

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

Jackson库进行JSON 序列化时遇到了无限递归(Infinite Recursion)的问题及解决方案

《Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursion)的问题及解决方案》使用Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursi... 目录解决方案‌1. 使用 @jsonIgnore 忽略一个方向的引用2. 使用 @JsonManagedR

Rust中的BoxT之堆上的数据与递归类型详解

《Rust中的BoxT之堆上的数据与递归类型详解》本文介绍了Rust中的BoxT类型,包括其在堆与栈之间的内存分配,性能优势,以及如何利用BoxT来实现递归类型和处理大小未知类型,通过BoxT,Rus... 目录1. Box<T> 的基础知识1.1 堆与栈的分工1.2 性能优势2.1 递归类型的问题2.2

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中, "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时,经常听到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及 BCNF(Boyce-Codd范式)。这些范式都旨在通过消除数据冗余和异常来优化数据库结构。然而,当我们谈到 4NF(第四范式)时,事情变得更加复杂。本文将带你深入了解 多值依赖 和 4NF,帮助你在数据库设计中消除更高级别的异常。 什么是

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法   消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法 [转载]原地址:http://blog.csdn.net/x605940745/article/details/17911115 消除SDK更新时的“