[1,1,1,1,1] [1,1,1,1,2] ... [1,1,1,1,9] [1,1,1,2,2] [1,1,1,2,3] ... [8,9,9,9,9] [9,9,9,9,9]
上記のような出力をするC++のプログラムを、再帰を使わずに実現したいです。
どうすればよいでしょうか。
以下は、再帰を使った実装です(一応、丸投げではないアピールです)。
cpp
1#include <iostream> 2#include <vector> 3 4using namespace std; 5 6void recurse(vector<int> *v, int len, int max) 7{ 8 int start; 9 int i, j; 10 if (v->size() == len) { 11 cout << "["; 12 for (j = 0; j < len-1; j++) { 13 cout << v->at(j) << ","; 14 } 15 cout << v->at(len-1) << "]" << endl; 16 return; 17 } 18 if (v->size() == 0) { 19 start = 1; 20 } else { 21 start = v->back(); 22 } 23 for (i = start; i <= max; i++) { 24 v->push_back(i); 25 recurse(v, len, max); 26 v->pop_back(); 27 } 28} 29 30int main(void) 31{ 32 vector<int> v; 33 recurse(&v, 5, 9); 34 return 0; 35}
【追記】
長さと最大値は可変にしたいです。最小値は、とりあえずは1で固定です。
【更に追記】
baseballyamaさんの回答を元に書いた、再帰無しのコードです。一応再帰無しで同等の処理が実現できましたので解決済みとします。回答してくださった皆様、ありがとうございました!ただ、僕としては、maxが2桁以上の場合でも正常に動作してほしいですし、再帰処理を再帰無しで記述する「普遍的な」方法を知りたかったです。その方法を知れれば、機械的に再帰無しコードに書き換えられるような…そんなメソッドが知りたかったのです。
cpp
1#include <iostream> 2 3using namespace std; 4 5void recurse(int len, int max) 6{ 7 // 数値型↔文字型の変換は、0x30を加算・減算することで行う 8 string smax = string(5, max + 0x30); 9 int imax = stoi(smax); 10 11 for (int i = 1; i <= imax; i++) { 12 bool flag = true; 13 string s = to_string(i); 14 15 for (int j = 0; j < s.size(); j++) { 16 // 要素が1以上max以下の条件を満たさない場合は出力しない 17 if (s[j] - 0x30 < 1 || s[j] - 0x30 > max) { 18 flag = false; 19 break; 20 } 21 // 左から右に昇順でない場合は出力しない 22 if (j > 0 && s[j - 1] > s[j]) { 23 flag = false; 24 break; 25 } 26 } 27 28 if (flag) { 29 cout << "["; 30 for (int j = 0; j < s.size(); j++) { 31 cout << s[j]; 32 if (j < s.size() - 1) { 33 cout << ","; 34 } 35 } 36 cout << "]" << endl; 37 } 38 } 39} 40 41int main(void) 42{ 43 recurse(5, 9); 44 return 0; 45}
回答5件
あなたの回答
tips
プレビュー