2017-06-07 16 views
-3

何らかの理由で、このPython線形検索が機能しません。私はそれを実行してリストにある値を入力するたびに、その項目がリストにあり、ただ実行されているとは言いません。 構文エラーがないので、何か論理的でなければなりません。何か案は?Python線形検索が機能しない

def linearSearch(): 
numbers = [3, 5, 54, 6, 17, 8, 32, 65, 87, 54] 
pointer = 0 
print("What would you like to search for?") 
searchTerm = input() 
try: 
    val = int(searchTerm) 
except ValueError: 
    print("Please enter an integer") 
    linearSearch() 
while pointer < len(numbers): 
    if numbers[pointer] == searchTerm: 
     print("Item has been found at " + pointer) 
    else: 
     pointer = pointer + 1 
+0

デバッガでそれを実行したときに何を見たのですか? –

+1

なぜPythonでインデックス機能を使ってみませんか? numbers.index(val)?? – Satyadev

+1

'numbers.index(int(val))'を使わないのはなぜですか? – MSeifert

答えて

1
if numbers[pointer] == searchTerm: 

私はあなたが書くためのものだと思う:

if numbers[pointer] == val: 

searchTermは(私たちはPythonの3.Xにいると仮定した場合)の文字列であるので、それはのいずれかに等しいとすることはありませんリスト内の整数。

追加問題:

  • あなたは、文字列と整数を連結することはできませんので、"Item has been found at" + pointerがクラッシュします。代わりにprint("Item has been found at", pointer)を使用してください。
  • アイテムが見つかると、pointerをインクリメントしないため、ループは「アイテムが見つかりました...」と無限に印刷されます。印刷後にbreakを追加してみてください。
  • ユーザーが整数を入力しない場合は、linearSearch()に再度呼び出します。しかし、元のコールはまだスタック上にあり、内部コールが完了すると実行を継続します。 valがそのコンテキストで正常に作成されなかったため、UnboundLocalError: local variable 'val' referenced before assignmentでクラッシュします。例えば、非再帰的なアプローチを考えてみましょう:

 

def linearSearch(): 
    numbers = [3, 5, 54, 6, 17, 8, 32, 65, 87, 54] 
    pointer = 0 
    print("What would you like to search for?") 
    while True: 
     try: 
      val = int(input()) 
      break 
     except ValueError: 
      print("Please enter an integer") 
    while pointer < len(numbers): 
     if numbers[pointer] == val: 
      print("Item has been found at", pointer) 
      break 
     else: 
      pointer = pointer + 1 

linearSearch() 
1

あなたはnumbers[pointer]と比較する文字列ですint型ではなくsearchTermあるvalを使用する必要があります。 さらに、ループを壊すことを忘れないでください。それ以外の場合は無期限に実行されます。

if numbers[pointer] == val: 
     print("Item has been found at " + str(pointer)) 
     break 

あなたは、文字列とint型を追加しようとすると、それはのpython3 +でエラーがスローされますので、編集str(pointer)を追加しました。

0

リニア検索:

// funtion which rturns true if item found inside list. 
    def linearSearch(list, value): 
      for i in range(len(list)): 
       if i == value: 
        return True 

//値やアイテムの関数パスリストの上に呼び出して検索する

list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
item = 10 
print(linearSearch(list, item)) // item to search 
関連する問題