回答編集履歴
1
追記
test
CHANGED
@@ -31,3 +31,51 @@
|
|
31
31
|
|
32
32
|
|
33
33
|
関数の引数なので、それはループの度に行うべき「計算式」を指定できるような場所ではなく、Rangeインスタンスの列挙の仕方を決める単なる「値」だと思います。つまり`k += m`を指定すべきではなく単に増分値として`m`を渡すのが適切だろうと思います。そもそもループが開始してもいない状況で(1)が計算されるわけなので、kという変数をstrideの引数には使えません。(エラーメッセージが言わんとしていることはそういうことでしょう)
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
---
|
38
|
+
|
39
|
+
追記:本回答はstrideに対してのみのものです。他にも間違いがあるのですが、詳細な説明は省略して「こういうふうにするととりあえず動いた」という例のみ挙げておきます。唯一の正解ではないのですが元のコードとの違いに着目して考えてみてはいかがでしょうか?
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
```swift
|
44
|
+
|
45
|
+
var A: [Int] = [0, 0]
|
46
|
+
|
47
|
+
for _ in 2...100 {
|
48
|
+
|
49
|
+
A.append(1)
|
50
|
+
|
51
|
+
}
|
52
|
+
|
53
|
+
for m in 2...100 {
|
54
|
+
|
55
|
+
for k in stride(from: m * 2, to: 101, by: m) {
|
56
|
+
|
57
|
+
A[k] = 0
|
58
|
+
|
59
|
+
}
|
60
|
+
|
61
|
+
}
|
62
|
+
|
63
|
+
for i in 0...100 {
|
64
|
+
|
65
|
+
if A[i] == 1 {
|
66
|
+
|
67
|
+
print(i)
|
68
|
+
|
69
|
+
}
|
70
|
+
|
71
|
+
}
|
72
|
+
|
73
|
+
```
|
74
|
+
|
75
|
+
余談:
|
76
|
+
|
77
|
+
ループの範囲を指定する際、よく`0..<N`というRange指定をします。なぜそうするかといえば配列の指標が1ではなく0から始まるためN個の指標を列挙するには0~N-1の範囲としなくてはならず、そのため終端の値を指定するのにNから1を引くのが「すっきりしない」という感覚から`0..<N`と書く習慣があるからだと思います。一方「STARTからEND(その値を含む)まで」を指定したいなら`START...END`と指定するのが自然と思います。「1から100までの間」を表現するのにわざわざ終端値に1を加えて`1..<101`としなくても`1...100`の方が自然に感じます。
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
これらは人それぞれの好みによっても違うかも知れません。
|