2015-10-29 11 views
5

私はかなりの時間それを行う方法と意図したように動作していないことを把握しようとしています。私は1からkまでの数字があるコードを書いています。繰り返しなしですべての組み合わせを見つける必要があります。例えば3:1、2、3、12、13forの再帰

例1、2、3、4、5

int k = 5; 
for (int p = 0; p < k; p++) 
{ 
    for (int i = p+1; i < k; i++) 
    { 
     for (int j = i + 1; j < k; j++) 
     { 
      for (int h = j + 1; h < k; h++) 
      { 
       cout << p + 1 << i + 1 << j + 1 << h + 1 << endl; 
      } 
     } 
    } 
} 

および実施例は、3桁のために存在すると4桁の数字をカウントします

int k = 4 
for (int p = 0; p < k; p++) 
{ 
    for (int i = p+1; i < k; i++) 
    { 
     for (int j = i + 1; j < k; j++) 
     { 
      cout << p + 1 << i + 1 << j + 1 << endl; 
     } 
    } 
} 

私はn桁の可能な位置を繰り返すことなくカウントすると思います。 そして、私はそれをするときに動作しない再帰なしにそれを行う方法を知らない。 私の目標は、n桁の可能な位置を数えて印刷する再帰を取得することです。

+0

最も内側の文は 'k'回だけ実行しませんか? – aschepler

+0

あなたはなぜこれをやりたいのか、そしてなぜあなたは "ループのために嫌な思い"が必要だと言いたいのですか?私はかなり単純な方法は、画面上の数字の同じシーケンスを印刷することです確信しています – user463035818

+0

実際にはあなたが求めているすべてで実際に明確ではありません。 "意図したとおりに動作していない"あなたは何をするつもりですか? – user463035818

答えて

0

これはあなたをかなり近づけると思います。私はここで時々繰り返すことがありますが、これはあなたを正しい道に置くべきです。

const int max_depth = 5; // How long your string is 
const int max_digit = 3; // Max digit you are counting to 
int *nums = new int [max_depth]; 

void recurse_count(int depth) 
{ 
    if (depth < max_depth) 
    { 
     for(int i = depth; i <= depth+1; i++) 
     { 
      nums[depth] = i; 
      recurse_count(i+1); 
     } 
    } 
    else 
    { 
     for (int j = 0; j < max_depth; j++) 
      cout<<nums[j]+1; 
     cout<<endl; 
    } 
} 

int main() 
{ 
    recurse_count(0); 
    return 0; 
} 
1

私は再帰がここに最良の選択であるかどうかわかりませんが、あなたはこのようにそれを行うことができます:

typedef std::vector<int> IV; 
IV getFirst(int k){ 
    IV res; 
    for (int i=0;i<k-1;i++){res.push_back(i+1);} 
    return res; 
} 

bool getNext(IV& numbers,int i){ 
    if (i==-1){return false;} // end of recursion 
    if (numbers[i]>i+1){return getNext(numbers,i-1);} 
    numbers[i]++; 
    return true; 
} 
bool getNext(IV& numbers){ // start of recursion 
    return getNext(numbers,numbers.size()-1); 
} 

int main() { 
    IV numbers = getFirst(5); 
    for (int i=0;i<numbers.size();i++){std::cout << numbers[i];} 
    std::cout << std::endl; 
    while(getNext(numbers)){ 
     for (int i=0;i<numbers.size();i++){std::cout << numbers[i];} 
     std::cout << std::endl; 
    } 
} 
+0

その素敵なコードは、私はそれを近くに見なければならない、私は100%のためにそれを得ることはありません、そしてより良い選択のためのあなたの提案は何ですか? – Sinma

+0

@Sinma私はループで再帰を置き換えようとしますが、実際には、読みやすさ(多分)のほうがはるかに大きな違いはありません – user463035818

+0

助けてくれてありがとうございました。私は他のすべてをする時間の。 – Sinma

2

私は可能性を自分自身をカウントするために再帰をしましたが、すべてのあなたの助けのためのあなたたちを愛し。

私の再帰はiloscは桁数で、sposobが可能な位置の数のカウントです

void col(int ilosc) 
{ 
    static int st; 
    for (int i = st++; i < k; i++) 
    { 
     if (ilosc > 1) 
      col(ilosc - 1); 
     else 
      sposob++; 
    } 
} 

です。

注:sposobおよびkはグローバル変数です。

+0

これは本当にわかりません;)しかし、うまくいけば答えを受け入れるべきです – user463035818

0

私のアプローチは、(まだ早い夕方にはおそらく、私はそれで問題があった)

namespace detail 
{ 
    void recurse_hlp(int min, int max, std::vector<int> vals, std::function<void(const std::vector<int>&)> f, std::size_t ptr) 
    { 
     if (ptr == vals.size()) 
      f(vals); 
     else 
     { 
      for (int i = min; i <= max; ++i) 
      { 
       vals[ptr] = i; 
       recurse_hlp(min, max, vals, f, ptr + 1); 
      } 
     } 
    } 
} 

void recurse(int min, int max, int count, std::function<void(const std::vector<int>&)> f) 
{ 
    std::vector<int> vals(count); 
    detail::recurse_hlp(min, max, vals, f, 0); 
} 

void print(const std::vector<int>& vals) 
{ 
    for (int v : vals) 
     std::cout << v << " "; 
    std::cout << std::endl; 
} 

int main() 
{ 
    recurse(0, 5, 3, &print); 
} 

recursecount場所までmaxminからすべての数字が含まれているstd::vector<int>を受け入れる機能を取得します。