回答編集履歴
1
追記
answer
CHANGED
@@ -14,4 +14,28 @@
|
|
14
14
|
|
15
15
|
ってやってみると`StrideTo<Int>`って表示されるので。
|
16
16
|
|
17
|
-
関数の引数なので、それはループの度に行うべき「計算式」を指定できるような場所ではなく、Rangeインスタンスの列挙の仕方を決める単なる「値」だと思います。つまり`k += m`を指定すべきではなく単に増分値として`m`を渡すのが適切だろうと思います。そもそもループが開始してもいない状況で(1)が計算されるわけなので、kという変数をstrideの引数には使えません。(エラーメッセージが言わんとしていることはそういうことでしょう)
|
17
|
+
関数の引数なので、それはループの度に行うべき「計算式」を指定できるような場所ではなく、Rangeインスタンスの列挙の仕方を決める単なる「値」だと思います。つまり`k += m`を指定すべきではなく単に増分値として`m`を渡すのが適切だろうと思います。そもそもループが開始してもいない状況で(1)が計算されるわけなので、kという変数をstrideの引数には使えません。(エラーメッセージが言わんとしていることはそういうことでしょう)
|
18
|
+
|
19
|
+
---
|
20
|
+
追記:本回答はstrideに対してのみのものです。他にも間違いがあるのですが、詳細な説明は省略して「こういうふうにするととりあえず動いた」という例のみ挙げておきます。唯一の正解ではないのですが元のコードとの違いに着目して考えてみてはいかがでしょうか?
|
21
|
+
|
22
|
+
```swift
|
23
|
+
var A: [Int] = [0, 0]
|
24
|
+
for _ in 2...100 {
|
25
|
+
A.append(1)
|
26
|
+
}
|
27
|
+
for m in 2...100 {
|
28
|
+
for k in stride(from: m * 2, to: 101, by: m) {
|
29
|
+
A[k] = 0
|
30
|
+
}
|
31
|
+
}
|
32
|
+
for i in 0...100 {
|
33
|
+
if A[i] == 1 {
|
34
|
+
print(i)
|
35
|
+
}
|
36
|
+
}
|
37
|
+
```
|
38
|
+
余談:
|
39
|
+
ループの範囲を指定する際、よく`0..<N`というRange指定をします。なぜそうするかといえば配列の指標が1ではなく0から始まるためN個の指標を列挙するには0~N-1の範囲としなくてはならず、そのため終端の値を指定するのにNから1を引くのが「すっきりしない」という感覚から`0..<N`と書く習慣があるからだと思います。一方「STARTからEND(その値を含む)まで」を指定したいなら`START...END`と指定するのが自然と思います。「1から100までの間」を表現するのにわざわざ終端値に1を加えて`1..<101`としなくても`1...100`の方が自然に感じます。
|
40
|
+
|
41
|
+
これらは人それぞれの好みによっても違うかも知れません。
|