| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1251 人关注过本帖
标题:关于递归调用中的计数问题
只看楼主 加入收藏
caihong123
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2008-3-17
收藏
 问题点数:0 回复次数:3 
关于递归调用中的计数问题
我在上算法的课程,有个程序让我们实验性计算mergesort的运行时间,要求只计归并部分的数值比较次数.但是因为mergesort部分是递归的,计数器每次都置零了,我写的程序都只能计最后一次归并的数值比较次数.怎么解决这个问题呢。我写的程序如下:请指教!

#include<cstdlib>
#include<cmath>
#include<iostream>
#include<iomanip>

using namespace std;
int ranInt(int m,int n);
void perm(int x[],int n);
int mergesort(int x[],int left,int right);
int merge(int x[],int l,int r);

int main()
{
    int x[201];
        for(int j=1;j<=10;j++)
    {
            perm(x,10);
            for(int i=1;i<=10;i++)
            {
                    cout<<x[i]<<"  ";
            }
                    cout<<endl;
            int c=mergesort(x,1,10);
            for(int i=1;i<=10;i++)
            {
                    cout<<x[i]<<"  ";
            }
            cout<<endl<<"count="<<c<<endl<<endl;
    }
   
    cout<<endl;
    cout<<endl<<endl;
   
for(int n=5;n<=200;n=n+5)
{
        int totalcount=0;
        for(int j=1;j<=10;j++)
        {
                perm(x,n);
                totalcount=totalcount+mergesort(x,1,n);
        }
        double Eav=totalcount/10.0;
        double scaledEav=Eav/(n*log(n)/log(2));
        cout<<endl<<setw(6)<<n<<setw(13)<<Eav<<setw(13)<<scaledEav;
}
cout<<endl<<endl;
 cin.get();
      cin.get();
      return 0;
}

int ranInt(int m,int n)
{
    double u=rand()/(RAND_MAX+1.0);
    return  (int)(m+floor((n-m+1)*u));
}

void perm(int x[],int n)
{
     for(int i=1;i<=n;i++)
     {
             x[i]=i;
     }
     for(int k=n;k>=2;k--)
     {
         int j=ranInt(1,k);
         int temp=x[k];
         x[k]=x[j];
         x[j]=temp;
     }
}

int mergesort(int x[],int left,int right)
{   int count=0;
    if (left<right)
    {  int middle=(left+right)/2;
       mergesort(x,left,middle);
       mergesort(x,middle+1,right);
      count=count+merge(x,left,right);
     }
    return count;
}

int merge(int x[],int l,int r)
{  int M=(l+r)/2;
   int count1=0;
   int i=l,j=M+1,k=1,temp[201];
   while((i<=M)&&(j<=r))
   {if (x[i]<=x[j])
       { temp[k]=x[i];
         i=i+1;
         count1++;
       }
    else { temp[k]=x[j];
            j=j+1;
            count1++;
          }
     k=k+1;
    }
   if(i>M)
   {
          for(int p=j;p<=r;p++)
          { temp[k]=x[p];
             k=k+1;
             }
   }
   else
   {   
        for(int p=i;p<=M;p++)
        {  temp[k]=x[p];
           k=k+1;
           }
   }
   int n=r-l+1;
   for(int p=1;p<=n;p++)
   x[l+p-1]=temp[p];
   return count1;
}
搜索更多相关主题的帖子: 递归 计数 
2008-03-17 00:50
caihong123
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2008-3-17
收藏
得分:0 
还有.为什么我每次运行产生的随机数都是相同的呢?
2008-03-17 01:04
lonmaor
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:郑州
等 级:版主
威 望:75
帖 子:2637
专家分:6423
注 册:2007-11-27
收藏
得分:0 
1.统计递归调用的次数,计数器应使用static型
2.随机数的产生,通常都是包含time.h文件,在生成随机数之前,使用以下语句
srand((unsigned)time(NULL));
初始化随机数种子。
2008-03-17 08:59
caihong123
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2008-3-17
收藏
得分:0 
谢谢楼上.
2008-03-17 09:29
快速回复:关于递归调用中的计数问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023655 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved