回答編集履歴

1

追記

2018/02/18 23:22

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

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
+ これらは人それぞれの好みによっても違うかも知れません。