求最大公约数,一个逐步消除递归的例子。
2015-01-15 21:46
429 查看
算法 stein www.cnblogs.com/drizzlecrj/archive/2007/09/14/892340.html
尾递归(就是return 函数本身;)能 很容易地 改成 循环。
return gcd(abs(a-b),min(a,b)); 是尾递归
return gcd(a>>1,b>>1)<<1; 不是尾递归,因为返回的不是函数本身,而是包含它的表达式,这样也不构成 尾递归。
于是得 把它改成 尾递归。如何改?只能更改递归的“接口”了。
把 goto 改写成 while 循环。
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; }
相关文章推荐
- C语言 编写一个函数,用递归方式求最大公约数。
- 常用算法(C#): 求一个数的最大公约数
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(5)欧几里得算法欧几里得算法求最大公约数
- 编译期递归的一个例子
- 递归求最大公约数
- 一个递归存储过程的例子
- 递归的一个例子
- 编程之美 2.7 最大公约数 扩展问题之逆转一个整数的二进制表示
- 编写一个计算一维数组中所有整数的最大公约数的函数
- 欧几里得法递归求最大公约数
- SQL2000 存储过程中实现递归的一个简单例子
- 递归求解最大公约数...
- 递归调用的一个例子
- 一个能够递归执行的makefile小例子
- PHP递归生成树的一个小例子
- 递归思想分析----以一个简单的例子为例
- 最大公约数,递归求解
- 最大公约数(递归)
- 最大公约数(递归版本)
- 分治 递归 引用 求一个数组中的最大和最小元素