回答編集履歴

1

修正

2018/03/24 11:53

投稿

can110
can110

スコア38266

test CHANGED
@@ -1,25 +1,35 @@
1
1
  上の段から順に、そのまま算出すればよいです。
2
2
 
3
- `Python`でのコード例です。このままだと100段くらいだとかなり時間かかりますが。
3
+ `Python`でのコード例です。~~このままだと100段くらいだとかなり時間かかりますが。~~
4
+
5
+ お手軽に`lru_cache`を使ってメモ化してみました。100段でも瞬時に求まります。
4
6
 
5
7
  ```Python
6
8
 
9
+ from functools import lru_cache
10
+
11
+
12
+
13
+ @lru_cache(maxsize=1000) # サイズは適当に
14
+
7
15
  def val( row, col):
8
16
 
9
- if col <= 0 or col >= row: # 両端なら1
17
+ if col <= 0 or col >= row:
10
18
 
11
19
  return 1
12
20
 
13
- return val( row-1, col-1) + val(row-1,col) # 上段の一つ左とその位置の数を足す
21
+ return val( row-1, col-1) + val(row-1,col)
14
22
 
15
23
 
16
24
 
17
- for row in range(100):
25
+ with open('ret.txt','w') as f: # 見づらいのでファイルに出力
18
26
 
19
- for col in range(row+1):
27
+ for row in range(100):
20
28
 
21
- print( "{:3d}".format( val( row, col)), end=' ')
29
+ for col in range(row+1):
22
30
 
31
+ f.write('{:40d}'.format( val( row, col))) # 40桁で足りる
32
+
23
- print('')
33
+ f.write('\n')
24
34
 
25
35
  ```