teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2018/02/18 23:22

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

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