datastru
知名人士
知名人士
  • 铜币2枚
  • 威望0点
  • 贡献值0点
阅读:946回复:3

[求助]这有一个用栈消除递归的程序,请帮个忙

楼主#
更多 发布于:2004-09-20 09:29
最近读的一本数据结构书上有一个把求两个数的最大公约数的递归程序转化为非递归的程序,递归函数是这样的:
                   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 修改 ]
我实话告诉你们,我可是身经百战了.bbs我见的多了,哪个版我没灌过?你们要知道, 一塌糊涂的triangle,PIC,SEX版,那比你们不知道厉害到哪里去了,我在那谈笑风声.你 们有一个好,就是无论在哪个版,什么话题都灌,但是灌来灌去的问题,都too simple, sometimes naive!你们懂不懂呀?啊?所以说灌水啊,关键是要提高自己的知识水平.你 们啊,不要总想着弄个大坑,然后灌上十大,再把我羞辱一番……你们啊,naive!你们这 样灌是不行地!~那你問我支持不支持灌水,我說支持,我常來這裡灌,你說支持不支持?
KxjIron
普通会员
普通会员
  • 铜币0枚
  • 威望0点
  • 贡献值1点
1C#
发布于: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
I like running
datastru
知名人士
知名人士
  • 铜币2枚
  • 威望0点
  • 贡献值0点
2C#
发布于:2004-09-22 08:13
Re:[求助]这有一个用栈消除递归的程序,请帮个忙
非常感谢楼上的这位高人,我之所以用栈是现在我正在学习这部分内容,不过这位高人的算法确实有过人之处,我会拷回去好好揣摩的。我说的不妥之处就是我用双斜线划掉的部分,运行起来总是得不到正确的结果,也可能是我的C有问题,那我再看看吧,最后还是多谢高人指点!!
我实话告诉你们,我可是身经百战了.bbs我见的多了,哪个版我没灌过?你们要知道, 一塌糊涂的triangle,PIC,SEX版,那比你们不知道厉害到哪里去了,我在那谈笑风声.你 们有一个好,就是无论在哪个版,什么话题都灌,但是灌来灌去的问题,都too simple, sometimes naive!你们懂不懂呀?啊?所以说灌水啊,关键是要提高自己的知识水平.你 们啊,不要总想着弄个大坑,然后灌上十大,再把我羞辱一番……你们啊,naive!你们这 样灌是不行地!~那你問我支持不支持灌水,我說支持,我常來這裡灌,你說支持不支持?
KxjIron
普通会员
普通会员
  • 铜币0枚
  • 威望0点
  • 贡献值1点
3C#
发布于:2004-09-22 13:40
Re:[求助]这有一个用栈消除递归的程序,请帮个忙
哈哈,谢谢师弟抬举了,我可不是什么高人,看到你搞这种实在的东东比较高兴
其实我搞不清什么较最大公约数,-20, 8 最大公约数是什么呢?4 还是 -4?
如果是 +4 的话,m,n 预先都取绝对值再处理就ok了
I like running
游客

返回顶部