将值从递归插入到全局c++集合中



首次提问者。今天早上我意识到,我知道如何通过简单的递归调用来执行感兴趣的任务。问题是全局集合没有被任何调用S.insert(n)所改变。我希望有一种直接的方法来重写它,以便用找到的数字填满集合。那么,问题是,如何做到这一点?

下面是我编写的函数,稍后调用它的片段,以及输出的相关部分。我对来自cerr命令的行完全满意,因此只需将这些值(每行中的第一个和第三个)放入STL集。我对如何做那部分的初步猜测不够好。

..............................................................

void insert_primitive_reps(unsigned int a, unsigned int h, unsigned int b, unsigned int M, set<unsigned int>  S)
{
  cerr << setw(12) << a  << setw(12) << h  << setw(12) << b << "   insert_primitive_reps"    << endl;
  if ( a <= M )
  {
    S.insert(a);
    if ( b <= M )
    {
      S.insert(b);
      if ( a <= M - b && h <= M - a - b)
      {
        if( a <= M - a - h ) insert_primitive_reps(a, h + 2 * a, a + b + h, M, S);
        if( b <= M - b - h ) insert_primitive_reps(a + b + h, h + 2 * b,b, M, S);
         // comment: once a+b+h <= M, min(2a+h, 2b+h) <= M
      }  // if a + b + h
    } // if  b
  } // if a
} // end insert_primitive_rep

.....................................

set<unsigned int>  S;
 insert_primitive_reps(1,3,1,100,  S);

cout << S.size() << endl; 

 set<unsigned int>::iterator iterU;
 for(iterU = S.begin() ;   iterU != S.end() ; ++iterU)
    {
      unsigned int p = *iterU;
      cout << setw(12) << p << Factored(p) << endl;
    }

......................................

 June 7    2014  
           1           3           1   insert_primitive_reps
           1           5           5   insert_primitive_reps
           1           7          11   insert_primitive_reps
           1           9          19   insert_primitive_reps
           1          11          29   insert_primitive_reps
           1          13          41   insert_primitive_reps
           1          15          55   insert_primitive_reps
           1          17          71   insert_primitive_reps
           1          19          89   insert_primitive_reps
          55          95          41   insert_primitive_reps
          41          69          29   insert_primitive_reps
          29          47          19   insert_primitive_reps
          95          85          19   insert_primitive_reps
          19          29          11   insert_primitive_reps
          19          67          59   insert_primitive_reps
          59          51          11   insert_primitive_reps
          11          15           5   insert_primitive_reps
          11          37          31   insert_primitive_reps
          11          59          79   insert_primitive_reps
          79          99          31   insert_primitive_reps
          31          25           5   insert_primitive_reps
          31          87          61   insert_primitive_reps
          61          35           5   insert_primitive_reps
           5           5           1   insert_primitive_reps
           5          15          11   insert_primitive_reps
           5          25          31   insert_primitive_reps
           5          35          61   insert_primitive_reps
          61          87          31   insert_primitive_reps
          31          37          11   insert_primitive_reps
          31          99          79   insert_primitive_reps
          79          59          11   insert_primitive_reps
          11           7           1   insert_primitive_reps
          11          29          19   insert_primitive_reps
          11          51          59   insert_primitive_reps
          59          67          19   insert_primitive_reps
          19           9           1   insert_primitive_reps
          19          47          29   insert_primitive_reps
          19          85          95   insert_primitive_reps
          29          11           1   insert_primitive_reps
          29          69          41   insert_primitive_reps
          41          13           1   insert_primitive_reps
          41          95          55   insert_primitive_reps
          55          15           1   insert_primitive_reps
          71          17           1   insert_primitive_reps
          89          19           1   insert_primitive_reps
 S size  0
jagy@phobeusjunior:~$

.........................................

来自朋友的帮助,加上在Deitel和Deitel的书中查找"解引用"的一些提示:

....................................

void insert_primitive_reps(unsigned int a, unsigned int h, unsigned int b, unsigned int M,  set<unsigned int>  *S)
{
  cerr << setw(12) << a  << setw(12) << h  << setw(12) << b << "   insert_primitive_reps"    << endl;
  if ( a <= M )
  {
    (*S).insert(a);
    if ( b <= M )
    {
      (*S).insert(b);
      if ( a <= M - b && h <= M - a - b)
      {
        if( a <= M - a - h ) insert_primitive_reps(a, h + 2 * a, a + b + h, M, S);
        if( b <= M - b - h ) insert_primitive_reps(a + b + h, h + 2 * b,b, M, S);
         // comment: once a+b+h <= M, min(2a+h, 2b+h) <= M
      }  // if a + b + h
    } // if  b
  } // if a
} // end insert_primitive_rep

...............................

cout << endl << " June 7    2014  " << endl << endl; 
set<unsigned int>  S;
 insert_primitive_reps(1,3,1,100,  &S);
cout <<  " S size  " << S.size() << endl; 

 set<unsigned int>::iterator iterU;
 for(iterU = S.begin() ;   iterU != S.end() ; ++iterU)
    {
      unsigned int p = *iterU;
      cout << setw(12) << p << Factored(p) << endl;
    }

.................................

 June 7    2014  
           1           3           1   insert_primitive_reps
           1           5           5   insert_primitive_reps
           1           7          11   insert_primitive_reps
           1           9          19   insert_primitive_reps
           1          11          29   insert_primitive_reps
           1          13          41   insert_primitive_reps
           1          15          55   insert_primitive_reps
           1          17          71   insert_primitive_reps
           1          19          89   insert_primitive_reps
          55          95          41   insert_primitive_reps
          41          69          29   insert_primitive_reps
          29          47          19   insert_primitive_reps
          95          85          19   insert_primitive_reps
          19          29          11   insert_primitive_reps
          19          67          59   insert_primitive_reps
          59          51          11   insert_primitive_reps
          11          15           5   insert_primitive_reps
          11          37          31   insert_primitive_reps
          11          59          79   insert_primitive_reps
          79          99          31   insert_primitive_reps
          31          25           5   insert_primitive_reps
          31          87          61   insert_primitive_reps
          61          35           5   insert_primitive_reps
           5           5           1   insert_primitive_reps
           5          15          11   insert_primitive_reps
           5          25          31   insert_primitive_reps
           5          35          61   insert_primitive_reps
          61          87          31   insert_primitive_reps
          31          37          11   insert_primitive_reps
          31          99          79   insert_primitive_reps
          79          59          11   insert_primitive_reps
          11           7           1   insert_primitive_reps
          11          29          19   insert_primitive_reps
          11          51          59   insert_primitive_reps
          59          67          19   insert_primitive_reps
          19           9           1   insert_primitive_reps
          19          47          29   insert_primitive_reps
          19          85          95   insert_primitive_reps
          29          11           1   insert_primitive_reps
          29          69          41   insert_primitive_reps
          41          13           1   insert_primitive_reps
          41          95          55   insert_primitive_reps
          55          15           1   insert_primitive_reps
          71          17           1   insert_primitive_reps
          89          19           1   insert_primitive_reps
 S size  14
           1 =  1 
           5 = 5
          11 = 11
          19 = 19
          29 = 29
          31 = 31
          41 = 41
          55 = 5 * 11
          59 = 59
          61 = 61
          71 = 71
          79 = 79
          89 = 89
          95 = 5 * 19
jagy@phobeusjunior:~$ 

.................................

最新更新