回答編集履歴

2

追記

2019/05/07 01:03

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -261,3 +261,171 @@
261
261
 
262
262
 
263
263
  遠回りしている感が否めませんが、NamedZipは少し使いやすそう。
264
+
265
+
266
+
267
+ コメントを受けて
268
+
269
+ ---
270
+
271
+ > 簡単な説明をコードに付け加えていただけると助かります。
272
+
273
+
274
+
275
+ デバッグプリントだけ加えておきました。
276
+
277
+ ```Python
278
+
279
+ import collections
280
+
281
+ import itertools
282
+
283
+
284
+
285
+
286
+
287
+ def gen_fibonacci_n(n: int):
288
+
289
+ sequence = collections.deque(
290
+
291
+ itertools.repeat(0, n-1)
292
+
293
+ )
294
+
295
+ sequence.append(1)
296
+
297
+
298
+
299
+ total = 1
300
+
301
+ while True:
302
+
303
+ print(sequence)
304
+
305
+ yield sequence[0]
306
+
307
+
308
+
309
+ sequence.append(total)
310
+
311
+ total = 2 * total - sequence.popleft()
312
+
313
+
314
+
315
+
316
+
317
+ print('{:-^20s}'.format('fibonacci'))
318
+
319
+ gen_fib = gen_fibonacci_n(2)
320
+
321
+ for e in itertools.islice(gen_fib, 10):
322
+
323
+ print(e)
324
+
325
+
326
+
327
+ print('{:-^20s}'.format('tribonacci'))
328
+
329
+ gen_trib = gen_fibonacci_n(3)
330
+
331
+ for e in itertools.islice(gen_trib, 10):
332
+
333
+ print(e)
334
+
335
+ ```
336
+
337
+
338
+
339
+ **実行結果** [Wandbox](https://wandbox.org/permlink/MNfMl7dScwcqGqGm)
340
+
341
+ ```plain
342
+
343
+ -----fibonacci------
344
+
345
+ deque([0, 1])
346
+
347
+ 0
348
+
349
+ deque([1, 1])
350
+
351
+ 1
352
+
353
+ deque([1, 2])
354
+
355
+ 1
356
+
357
+ deque([2, 3])
358
+
359
+ 2
360
+
361
+ deque([3, 5])
362
+
363
+ 3
364
+
365
+ deque([5, 8])
366
+
367
+ 5
368
+
369
+ deque([8, 13])
370
+
371
+ 8
372
+
373
+ deque([13, 21])
374
+
375
+ 13
376
+
377
+ deque([21, 34])
378
+
379
+ 21
380
+
381
+ deque([34, 55])
382
+
383
+ 34
384
+
385
+ -----tribonacci-----
386
+
387
+ deque([0, 0, 1])
388
+
389
+ 0
390
+
391
+ deque([0, 1, 1])
392
+
393
+ 0
394
+
395
+ deque([1, 1, 2])
396
+
397
+ 1
398
+
399
+ deque([1, 2, 4])
400
+
401
+ 1
402
+
403
+ deque([2, 4, 7])
404
+
405
+ 2
406
+
407
+ deque([4, 7, 13])
408
+
409
+ 4
410
+
411
+ deque([7, 13, 24])
412
+
413
+ 7
414
+
415
+ deque([13, 24, 44])
416
+
417
+ 13
418
+
419
+ deque([24, 44, 81])
420
+
421
+ 24
422
+
423
+ deque([44, 81, 149])
424
+
425
+ 44
426
+
427
+ ```
428
+
429
+
430
+
431
+ dequeをn長のキューとして利用しています。

1

追記

2019/05/07 01:02

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -11,3 +11,253 @@
11
11
  lst = [fib, trib, ..., dod]
12
12
 
13
13
  ```
14
+
15
+
16
+
17
+ 追記
18
+
19
+ ---
20
+
21
+ 関数fib, trib, tetrなどの計算量が気になります。
22
+
23
+ [functools.lru_cache](https://docs.python.org/ja/3/library/functools.html#functools.lru_cache)を利用するか、ジェネレータ関数として実装し直すことをお勧めします。
24
+
25
+
26
+
27
+ ランダムアクセスが必須なら前者、シーケンシャルアクセスで良いなら後者が良いでしょう。
28
+
29
+
30
+
31
+ 書いてみた
32
+
33
+ ---
34
+
35
+ 面白そうだったので、個人的な趣味全開で書いてみました。
36
+
37
+
38
+
39
+ **main.py**
40
+
41
+ ```Python
42
+
43
+ from fibonacci import gen_fibonacci_n
44
+
45
+ from namedzip import NamedZip
46
+
47
+
48
+
49
+
50
+
51
+ func_dct = dict(zip(
52
+
53
+ ['fib', 'trib', 'tetr'], map(gen_fibonacci_n, [2, 3, 4])
54
+
55
+ ))
56
+
57
+
58
+
59
+ it = enumerate(NamedZip(**func_dct), start=1)
60
+
61
+ for count, dct in it:
62
+
63
+ print('{:-^20s}'.format(f' count: {count:2d} '))
64
+
65
+ for name, val in dct.items():
66
+
67
+ print('{:6s} {:3d}'.format(f'{name}:', val))
68
+
69
+
70
+
71
+ print()
72
+
73
+
74
+
75
+ #
76
+
77
+ if dct['fib'] < dct['trib']:
78
+
79
+ break
80
+
81
+ ```
82
+
83
+
84
+
85
+ **fibonacci.py**
86
+
87
+ ```Python
88
+
89
+ import collections
90
+
91
+ import itertools
92
+
93
+
94
+
95
+
96
+
97
+ def gen_fibonacci_n(n: int):
98
+
99
+ sequence = collections.deque(
100
+
101
+ itertools.repeat(0, n-1)
102
+
103
+ )
104
+
105
+ sequence.append(1)
106
+
107
+
108
+
109
+ total = 1
110
+
111
+ while True:
112
+
113
+ yield sequence[0]
114
+
115
+
116
+
117
+ sequence.append(total)
118
+
119
+ total = 2 * total - sequence.popleft()
120
+
121
+ ```
122
+
123
+
124
+
125
+ **namedzip.py**
126
+
127
+ ```Python
128
+
129
+ class NamedZip:
130
+
131
+ def __init__(self, dct=None, **kwards):
132
+
133
+ if dct:
134
+
135
+ kwards = {**dct, **kwards}
136
+
137
+
138
+
139
+ self._names = kwards.keys()
140
+
141
+ self._iters = [
142
+
143
+ iter(val) for val in kwards.values()
144
+
145
+ ]
146
+
147
+
148
+
149
+ def __iter__(self):
150
+
151
+ return self
152
+
153
+
154
+
155
+ def __next__(self):
156
+
157
+ return dict(zip(
158
+
159
+ self._names, [next(it) for it in self._iters]
160
+
161
+ ))
162
+
163
+ ```
164
+
165
+
166
+
167
+ **実行結果** [Wandbox](https://wandbox.org/permlink/RVoweZzHW35MlIQP)
168
+
169
+ ```plain
170
+
171
+ ---- count: 1 -----
172
+
173
+ fib: 0
174
+
175
+ trib: 0
176
+
177
+ tetr: 0
178
+
179
+
180
+
181
+ ---- count: 2 -----
182
+
183
+ fib: 1
184
+
185
+ trib: 0
186
+
187
+ tetr: 0
188
+
189
+
190
+
191
+ ---- count: 3 -----
192
+
193
+ fib: 1
194
+
195
+ trib: 1
196
+
197
+ tetr: 0
198
+
199
+
200
+
201
+ ---- count: 4 -----
202
+
203
+ fib: 2
204
+
205
+ trib: 1
206
+
207
+ tetr: 1
208
+
209
+
210
+
211
+ ---- count: 5 -----
212
+
213
+ fib: 3
214
+
215
+ trib: 2
216
+
217
+ tetr: 1
218
+
219
+
220
+
221
+ ---- count: 6 -----
222
+
223
+ fib: 5
224
+
225
+ trib: 4
226
+
227
+ tetr: 2
228
+
229
+
230
+
231
+ ---- count: 7 -----
232
+
233
+ fib: 8
234
+
235
+ trib: 7
236
+
237
+ tetr: 4
238
+
239
+
240
+
241
+ ---- count: 8 -----
242
+
243
+ fib: 13
244
+
245
+ trib: 13
246
+
247
+ tetr: 8
248
+
249
+
250
+
251
+ ---- count: 9 -----
252
+
253
+ fib: 21
254
+
255
+ trib: 24
256
+
257
+ tetr: 15
258
+
259
+ ```
260
+
261
+
262
+
263
+ 遠回りしている感が否めませんが、NamedZipは少し使いやすそう。