|
阅读:946回复:3
[求助]这有一个用栈消除递归的程序,请帮个忙
最近读的一本数据结构书上有一个把求两个数的最大公约数的递归程序转化为非递归的程序,递归函数是这样的:
gcd(n,m) if(m<0) gcd(m,n) = {m if(n=0) gcd(n,m MOD n) others m MOD n 表示m 对 n取模 我试着乱编了一下,结果是两个正数的可以,可有一个数或两个数都是负数就不行了,请那位高人帮我完善一下谢了!![em087]我的程序是这样的: #include<iostream.h> #define M 1000 int gcd(int m, int n) { int STACK[M], top = -1; do{ if(n!=0) { //if(m<0) //{int temp = m; m = n; n = temp;} //else //划线部分就是要求的负数算法部分,渴望斧正!! {STACK[++top] = m%n; m = n;n = STACK[top];} } //将m%n入栈,并将n与m%n再赋值给m,n继续运算 else if(top>=0) n = STACK[top--]; }while(top>=0); return m; } int main() { int m,n; cout<<"请输入m"<<endl; cin>>m; cout<<"请输入n"<<endl; cin>>n; cout<<'\n'; cout<<"最大公约数是:"<<gcd(m,n)<<endl; } //请在c++下运行 [ 2004-09-20 10:42:59 datastru 修改 ] |
|
|
|
1C#
发布于:2004-09-22 13:40
Re:[求助]这有一个用栈消除递归的程序,请帮个忙
哈哈,谢谢师弟抬举了,我可不是什么高人,看到你搞这种实在的东东比较高兴
其实我搞不清什么较最大公约数,-20, 8 最大公约数是什么呢?4 还是 -4? 如果是 +4 的话,m,n 预先都取绝对值再处理就ok了 |
|
|
|
2C#
发布于:2004-09-22 08:13
Re:[求助]这有一个用栈消除递归的程序,请帮个忙
非常感谢楼上的这位高人,我之所以用栈是现在我正在学习这部分内容,不过这位高人的算法确实有过人之处,我会拷回去好好揣摩的。我说的不妥之处就是我用双斜线划掉的部分,运行起来总是得不到正确的结果,也可能是我的C有问题,那我再看看吧,最后还是多谢高人指点!! |
|
|
|
3C#
发布于:2004-09-20 18:08
Re:[求助]这有一个用栈消除递归的程序,请帮个忙
hello, datastru
我试过你的算法了,你得算法没有问题啊? 不知道你所说的负数就出问题是指啥 不过 gcd 的递归没有必要用栈消除 int gcd( int num1, int num2 ) { int tmp; for(;;) { if ( num2 == 0 ) { return(num1); } tmp = num1; num1 = num2; num2 = tmp%num2; } /* disable warning */ return(0); } -------------------- I like running |
|
|