回答編集履歴
3
素数のプログラムのバグ修正
answer
CHANGED
@@ -141,18 +141,17 @@
|
|
141
141
|
# わざと終了条件を与えず、無限長の素数列を得る例
|
142
142
|
def primes():
|
143
143
|
yield 2
|
144
|
-
|
144
|
+
for p in unfoldr(isPrime, 3):
|
145
|
-
while True:
|
146
|
-
yield
|
145
|
+
yield p
|
147
146
|
|
148
147
|
def isPrime(n):
|
149
|
-
ps = primes()
|
150
148
|
while True:
|
151
|
-
p
|
149
|
+
for p in primes():
|
152
|
-
|
150
|
+
if p ** 2 > n:
|
153
|
-
|
151
|
+
return n, n + 2
|
154
|
-
|
152
|
+
elif n % p == 0:
|
155
|
-
|
153
|
+
n += 2
|
154
|
+
break
|
156
155
|
|
157
156
|
|
158
157
|
if __name__ == '__main__':
|
2
文章修正 + リンク修正
answer
CHANGED
@@ -56,10 +56,10 @@
|
|
56
56
|
|
57
57
|
```
|
58
58
|
|
59
|
-
```
|
59
|
+
```unfoldr```は```range```の上位互換な故、```unfoldr```の機能を制限する事で```range```が書けるわけだ。
|
60
60
|
|
61
|
-
```
|
62
|
-
```
|
61
|
+
```unfoldr```は[Haskell](https://www.haskell.org)と言うプログラミング言語の[```unfoldr```](https://hackage.haskell.org/package/ghc-internal-9.1201.0/docs/src/GHC.Internal.Data.OldList.html#unfoldr)をPython向けに移植したモノだ。
|
62
|
+
```unfoldr```は引数を2つ取り、第一引数は関数、第二引数に「シード」と呼ばれる単一の値(データ)を取る。
|
63
63
|
ここで第一引数で取る関数のカタチが特徴的だ。ここでは[ラムダ式](https://docs.python.org/ja/3.13/tutorial/controlflow.html#lambda-expressions)を使うが、作成すべき関数は次のルールに従う。
|
64
64
|
|
65
65
|
```Python
|
1
文章修正
answer
CHANGED
@@ -32,7 +32,7 @@
|
|
32
32
|
|
33
33
|
```
|
34
34
|
|
35
|
-
ここで作成したイテレータ```unfoldr```は、Python組み込みのイテレータ[```range```](https://docs.python.org/ja/3.13/library/functions.html#func-range)の亜種だ。
|
35
|
+
ここで作成した[イテレータ](https://docs.python.org/ja/3.13/tutorial/classes.html#iterators)```unfoldr```は、Python組み込みのイテレータ[```range```](https://docs.python.org/ja/3.13/library/functions.html#func-range)の亜種だ。
|
36
36
|
と言うより、[```range```](https://docs.python.org/ja/3.13/library/functions.html#func-range)の上位互換だ。
|
37
37
|
|
38
38
|
```Python
|
@@ -42,7 +42,7 @@
|
|
42
42
|
[0, 1, 2]
|
43
43
|
|
44
44
|
```
|
45
|
-
従って、単純には、```range```は```
|
45
|
+
従って、単純には、```range```は```unfoldr```を利用すると次のように書ける。
|
46
46
|
|
47
47
|
```Python
|
48
48
|
def range(*args):
|