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

回答編集履歴

3

d

2020/11/02 03:46

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -3,55 +3,22 @@
3
3
  水を再帰的に追加していき、総容量が上限を超えたら再帰関数を終了します。
4
4
  以下のようにすれば、入れられる水の種類が増えても対応できます。
5
5
 
6
-
7
-
8
6
  ```python
9
7
  waters = [100, 150] # 入れられる水の容量
10
- limit = 300 # 水の容量の上限
8
+ limit = 300 # 容量の上限
11
- patterns = set() # パターン記録用 重複を除くために set を利用
9
+ patterns = [] # パターン記録用
12
10
 
13
11
 
14
- def find_pattern(water=0, lst=[]):
12
+ def find_pattern(lst=tuple()):
15
- """water: 追加する水の容量
13
+ """lst: 入れた水の履歴
16
- lst: 入れた水の履歴
17
14
  """
18
15
  if sum(lst) > limit:
19
- # 上限を超えた場合は記録して、再帰関数を終了する。
16
+ return # 上限を超えた場合は再帰を終了する。
20
- return patterns.add(tuple(lst[:-1]))
21
17
 
22
- for water in waters:
23
- find_pattern(water, lst + [water])
18
+ patterns.append(lst)
24
19
 
25
-
26
- find_pattern()
27
-
28
- print(patterns) # 手順のパターン
29
- # {(150, 100), (100, 100), (100, 150), (150, 150), (100, 100, 100)}
30
- print(set(sum(x) for x in patterns)) # 容量のパターン
31
- # {200, 250, 300}
32
- ```
33
-
34
- 300mL以下のパターンは全部 OK とするならば、以下のようにします。
35
-
36
- ```
37
- waters = [100, 150] # 入れられる水の容量
38
- limit = 300 # 容量の上限
39
- patterns = set() # パターン記録用
40
-
41
-
42
- def find_pattern(water=0, lst=[]):
43
- """water: 追加する水の容量
44
- lst: 入れた水の履歴
45
- """
46
- if sum(lst) > limit:
47
- # 上限を超えた場合は再帰関数を終了する。
48
- return
49
- else:
50
- patterns.add(tuple(lst))
51
-
52
-
53
20
  for water in waters:
54
- find_pattern(water, lst + [water])
21
+ find_pattern(lst + (water,))
55
22
 
56
23
 
57
24
  find_pattern()
@@ -60,4 +27,6 @@
60
27
  # {(150,), (150, 100), (100, 100), (100, 150), (100,), (150, 150), (100, 100, 100), ()}
61
28
  print(set(sum(x) for x in patterns)) # 容量のパターン
62
29
  # {0, 100, 200, 300, 150, 250}
63
- ```
30
+ ```
31
+
32
+ 不要な処理を削りました。

2

修正

2020/11/02 03:46

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -26,7 +26,7 @@
26
26
  find_pattern()
27
27
 
28
28
  print(patterns) # 手順のパターン
29
- # {(150,), (150, 100), (100, 100), (100, 150), (100,), (150, 150), (100, 100, 100), ()}
29
+ # {(150, 100), (100, 100), (100, 150), (150, 150), (100, 100, 100)}
30
30
  print(set(sum(x) for x in patterns)) # 容量のパターン
31
31
  # {200, 250, 300}
32
32
  ```

1

修正

2020/11/01 20:43

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -31,10 +31,6 @@
31
31
  # {200, 250, 300}
32
32
  ```
33
33
 
34
- ```output
35
- {(150, 100), (100, 100), (100, 150), (150, 150), (100, 100, 100)}
36
- ```
37
-
38
34
  300mL以下のパターンは全部 OK とするならば、以下のようにします。
39
35
 
40
36
  ```