質問するログイン新規登録

質問編集履歴

5

誤字の修正

2017/12/31 07:52

投稿

toshiyan
toshiyan

スコア74

title CHANGED
File without changes
body CHANGED
@@ -57,7 +57,7 @@
57
57
  長さと最大値は可変にしたいです。最小値は、とりあえずは1で固定です。
58
58
 
59
59
  【更に追記】
60
- baseballyamaさんの回答を元に書いた、再帰無しのコードです。一応再帰無しで同等の処理が実現できましたので解決済みとします。解凍してくださった皆様、ありがとうございました!ただ、僕としては、maxが2桁以上の場合でも正常に動作してほしいですし、再帰処理を再帰無しで記述する「普遍的な」方法を知りたかったです。その方法を知れれば、機械的に再帰無しコードに書き換えられるような…そんなメソッドが知りたかったのです。
60
+ baseballyamaさんの回答を元に書いた、再帰無しのコードです。一応再帰無しで同等の処理が実現できましたので解決済みとします。回答してくださった皆様、ありがとうございました!ただ、僕としては、maxが2桁以上の場合でも正常に動作してほしいですし、再帰処理を再帰無しで記述する「普遍的な」方法を知りたかったです。その方法を知れれば、機械的に再帰無しコードに書き換えられるような…そんなメソッドが知りたかったのです。
61
61
 
62
62
  ```cpp
63
63
  #include <iostream>

4

再帰無しのコード追加

2017/12/31 07:52

投稿

toshiyan
toshiyan

スコア74

title CHANGED
File without changes
body CHANGED
@@ -54,4 +54,55 @@
54
54
  ```
55
55
 
56
56
  【追記】
57
- 長さと最大値は可変にしたいです。最小値は、とりあえずは1で固定です。
57
+ 長さと最大値は可変にしたいです。最小値は、とりあえずは1で固定です。
58
+
59
+ 【更に追記】
60
+ baseballyamaさんの回答を元に書いた、再帰無しのコードです。一応再帰無しで同等の処理が実現できましたので解決済みとします。解凍してくださった皆様、ありがとうございました!ただ、僕としては、maxが2桁以上の場合でも正常に動作してほしいですし、再帰処理を再帰無しで記述する「普遍的な」方法を知りたかったです。その方法を知れれば、機械的に再帰無しコードに書き換えられるような…そんなメソッドが知りたかったのです。
61
+
62
+ ```cpp
63
+ #include <iostream>
64
+
65
+ using namespace std;
66
+
67
+ void recurse(int len, int max)
68
+ {
69
+ // 数値型↔文字型の変換は、0x30を加算・減算することで行う
70
+ string smax = string(5, max + 0x30);
71
+ int imax = stoi(smax);
72
+
73
+ for (int i = 1; i <= imax; i++) {
74
+ bool flag = true;
75
+ string s = to_string(i);
76
+
77
+ for (int j = 0; j < s.size(); j++) {
78
+ // 要素が1以上max以下の条件を満たさない場合は出力しない
79
+ if (s[j] - 0x30 < 1 || s[j] - 0x30 > max) {
80
+ flag = false;
81
+ break;
82
+ }
83
+ // 左から右に昇順でない場合は出力しない
84
+ if (j > 0 && s[j - 1] > s[j]) {
85
+ flag = false;
86
+ break;
87
+ }
88
+ }
89
+
90
+ if (flag) {
91
+ cout << "[";
92
+ for (int j = 0; j < s.size(); j++) {
93
+ cout << s[j];
94
+ if (j < s.size() - 1) {
95
+ cout << ",";
96
+ }
97
+ }
98
+ cout << "]" << endl;
99
+ }
100
+ }
101
+ }
102
+
103
+ int main(void)
104
+ {
105
+ recurse(5, 9);
106
+ return 0;
107
+ }
108
+ ```

3

追記

2017/12/31 07:49

投稿

toshiyan
toshiyan

スコア74

title CHANGED
File without changes
body CHANGED
@@ -51,4 +51,7 @@
51
51
  recurse(&v, 5, 9);
52
52
  return 0;
53
53
  }
54
- ```
54
+ ```
55
+
56
+ 【追記】
57
+ 長さと最大値は可変にしたいです。最小値は、とりあえずは1で固定です。

2

なぜか更新できていなかったので再度更新

2017/12/31 04:15

投稿

toshiyan
toshiyan

スコア74

title CHANGED
File without changes
body CHANGED
@@ -21,25 +21,6 @@
21
21
 
22
22
  using namespace std;
23
23
 
24
- int LEN = 5;
25
- int MAX = 9;
26
-
27
- void recurse(vector<int> *v)
28
- {
29
- int start;
30
- int i;
31
- if (v->size() == LEN) {
32
- printf("[%d,%d,%d,%d,%d]\n",v->at(0),v->at(1),v->at(2),v->at(3),v->at(4));
33
- return;
34
- }
35
- if (v->size() == 0) {
36
- start = 1;
37
- } else {
38
- #include <iostream>
39
- #include <vector>
40
-
41
- using namespace std;
42
-
43
24
  void recurse(vector<int> *v, int len, int max)
44
25
  {
45
26
  int start;

1

printfを、配列の長さに対応させる

2017/12/31 04:10

投稿

toshiyan
toshiyan

スコア74

title CHANGED
File without changes
body CHANGED
@@ -35,11 +35,31 @@
35
35
  if (v->size() == 0) {
36
36
  start = 1;
37
37
  } else {
38
+ #include <iostream>
39
+ #include <vector>
40
+
41
+ using namespace std;
42
+
43
+ void recurse(vector<int> *v, int len, int max)
44
+ {
45
+ int start;
46
+ int i, j;
47
+ if (v->size() == len) {
48
+ cout << "[";
49
+ for (j = 0; j < len-1; j++) {
50
+ cout << v->at(j) << ",";
51
+ }
52
+ cout << v->at(len-1) << "]" << endl;
53
+ return;
54
+ }
55
+ if (v->size() == 0) {
56
+ start = 1;
57
+ } else {
38
58
  start = v->back();
39
59
  }
40
- for (i = start; i <= MAX; i++) {
60
+ for (i = start; i <= max; i++) {
41
61
  v->push_back(i);
42
- recurse(v);
62
+ recurse(v, len, max);
43
63
  v->pop_back();
44
64
  }
45
65
  }
@@ -47,7 +67,7 @@
47
67
  int main(void)
48
68
  {
49
69
  vector<int> v;
50
- recurse(&v);
70
+ recurse(&v, 5, 9);
51
71
  return 0;
52
72
  }
53
73
  ```