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

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

相关文章

深入理解数据库的 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更新时的“

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

JavaFX环境的搭建和一个简单的例子

之前在网上搜了很多与javaFX相关的资料,都说要在Eclepse上要安装sdk插件什么的,反正就是乱七八糟的一大片,最后还是没搞成功,所以我在这里写下我搭建javaFX成功的环境给大家做一个参考吧。希望能帮助到你们! 1.首先要保证你的jdk版本能够支持JavaFX的开发,jdk-7u25版本以上的都能支持,最好安装jdk8吧,因为jdk8对支持JavaFX有新的特性了,比如:3D等;

oracle11.2g递归查询(树形结构查询)

转自: 一 二 简单语法介绍 一、树型表结构:节点ID 上级ID 节点名称二、公式: select 节点ID,节点名称,levelfrom 表connect by prior 节点ID=上级节点IDstart with 上级节点ID=节点值 oracle官网解说 开发人员:SQL 递归: 在 Oracle Database 11g 第 2 版中查询层次结构数据的快速

javaScript日期相加减例子

当前时间加上2天 var d = new Date(“2015-7-31”); d.setDate(d.getDate()+2); var addTwo=d.getFullYear()+”年”+(d.getMonth()+1)+”月”+d.getDate()+”日”; “控制台输出===============”+”当前日期加2天:”+addTwo; 使用这种方法,月份也会给你计算.

设计模式大全和详解,含Python代码例子

若有不理解,可以问一下这几个免费的AI网站 https://ai-to.cn/chathttp://m6z.cn/6arKdNhttp://m6z.cn/6b1quhhttp://m6z.cn/6wVAQGhttp://m6z.cn/63vlPw 下面是设计模式的简要介绍和 Python 代码示例,涵盖主要的创建型、结构型和行为型模式。 一、创建型模式 1. 单例模式 (Singleton

JSP 简单表单显示例子

<html><!--http://localhost:8080/test_jsp/input.html --><head><meta http-equiv="Content-Type" content="text/HTML; charset=utf-8"><title>input页面</title></head><body><form action="input.jsp" method

shell循环sleep while例子 条件判断

i=1# 小于5等于时候才执行while [ ${i} -le 5 ]doecho ${i}i=`expr ${i} + 1`# 休眠3秒sleep 3doneecho done 参考 http://c.biancheng.net/cpp/view/2736.html

Leetcode面试经典150题-128.最长连续序列-递归版本另解

之前写过一篇这个题的,但是可能代码比较复杂,这回来个简洁版的,这个是递归版本 可以看看之前的版本,两个版本面试用哪个都保过 解法都在代码里,不懂就留言或者私信 class Solution {/**对于之前的解法,我现在提供一共更优的解,但是这种可能会比较难懂一些(思想方面)代码其实是很简洁的,总体思想如下:不需要排序直接把所有数放入map,map的key是当前数字,value是当前数开始的