
[code]

    def LinearSearch(N, a):
    n = len(N)
    for i in range(n):
        if N[i] == a:
            return True
    
        else:
            return False
    
    N = [13, 16, 23, 45, 54, 58, 76, 91]
    a = 76
    
    ans = LinearSearch(N, a)
    print(ans)
    
[/code]

結果が何故かfalseになってしまいます、  
for文とif文の組み合わせが良くないのでしょうか。  
よろしくお願いします。


CC BY-SA 4.0
2018-07-15T13:31:44.653
46636
2018-07-16T05:35:29.713
29315
question
python xcode visual-studio
線分探索でエラーが出る原因


> for文とif文の組み合わせが良くないのでしょうか。

そう思います。for文内の最初の`13`を比較する際に、偽となるため、`False`がリターンされ、for文を抜けています。1つの要素しか比較されていません。

例えば、以下のように、for文内は、真の場合のみ`True`を返却し、for文を終了した場合は、`False`を返却するば良いと思います。

いずれにしても、お使いの開発環境で、Pythonをデバッグできるようになると、ご自身で現象の把握とバグの修正ができると思います。

[code]

    def LinearSearch(N, a):
        n = len(N)
        for i in range(n):
            if N[i] == a:
                return True
        return False
    
    
    N = [13, 16, 23, 45, 54, 58, 76, 91]
    a = 76
    
    ans = LinearSearch(N, a)
    print(ans)
    
[/code]


CC BY-SA 4.0
2018-07-15T13:44:55.350
46637
2018-07-15T13:44:55.350
46636
answer


`LinearSearch` 関数内のループでは、まず最初の要素 `N[0]` と `a` とを比較することになりますが、ここで `N[0]` と `a`
が等しくなかったら即座に `return False` してしまいます。これがバグの原因です。

実際にはそうではなく、全ての要素と比較した上でどれとも等しくなかったら `return False` する、というようになるはずです。

以下にサンプルコードを書きましたので、必要に応じてご利用ください（マウスカーソルを重ねると表示されます）。

> def LinearSearch(N, a):  
>      n = len(N)  
>      for i in range(n):  
>          if N[i] == a:  
>              return True  
>      return False


CC BY-SA 4.0
2018-07-15T13:45:00.280
46638
2018-07-15T13:45:00.280
19110
46636
answer


推測ですが、wakewakameman さんは、以下の様に書こうと思ったのではないでしょうか。

[code]

    def LinearSearch(N, a):
      n = len(N)
      for i in range(n):
        if N[i] == a:
            return True
      else:
        return False
    
[/code]

# この書き方が間違いというわけでもありませんけれども


CC BY-SA 4.0
2018-07-15T14:38:46.727
46639
2018-07-15T14:38:46.727
46636
answer


おそらくpythonをアルゴリズム学習に使用していると推察されますが、python的な書き方を提示しておきます。

[code]

    N = [13, 16, 23, 45, 54, 58, 76, 91] #Nは自然数を示すのが通例なので、この名付けは推奨しない
    a = 76
    
[/code]

として

[code]

    a in N
    
[/code]

と記述すれば、求める結果が得られます。  
設問者が提示したコードの流れは、  
N[0]=13は76ではないのでN[0]==76はFalse、よってelse句以降の文が実行される。  
return Falseで関数LinearSearchを抜けるためforループからも脱出し、そのままFalseとなる。


CC BY-SA 4.0
2018-07-16T05:35:29.713
46650
2018-07-16T05:35:29.713
25980
46636
answer