2017-02-15 15 views
0

私は本当に道を見つけることができないので、少し質問をしました。 IsはPythonよりも論理的な質問です。私がやっていることは、結果が正確でないか間違っているときに再びメソッドを呼び出すことです。私はこれを行うために再帰を使用していますが、明らかに、呼び出される再帰メソッドと同じくらい多くの値を返します。再帰の代わりに - Python

センサーからのこの結果が正確でないときに、ロボットアームの 'z'を超音波センサーで見つける方法を使用しています。このメソッドをもう一度呼び出すと、再びプロセスを再開します。

def get_z_from_ultrasonic_sensor(self, uarm, x, y): 

    # clear all IO data 
    self.serial_port.reset_input_buffer() 
    self.serial_port.reset_output_buffer() 

    count = 0 
    z = 110 
    uarm.set_position(x, y, z, 1) 
    time.sleep(2) 
    global input 
    # if self.count is 1: 
    #  while True: 
    #   print(self.serial_port.readline()) 
    while True: 
     # if z is to small, means that has not been detected well, recursive call 
     if z < 70: 
      self.get_z_from_ultrasonic_sensor(uarm, x, y) 

     # check if input is an integer else, recursive call 
     try: 
      input = int(self.serial_port.readline()) 

      if input > 160: 
       break 
     except: 
      break 

     if input <= 116: 
      # print("Distance:", int(input)) 
      break 
     else: 
      count = count + 1 
      # print("Distance:", int(input)) 
      # print("Z", z) 
      if count is 5: 
       z = z - 1 
       count = 0 
       print("US Distance:", int(input)) 
       print("Z Robot", z) 
     uarm.set_position(x, y, z, 1) 

    if z is 110: 
     pass 
    print("Z to Write:", z) 
    # self.count += 1 
    return z-6 

私が欲しいのはただ一つの値が返さ取得することで、できるだけ多くない値は、再帰呼び出しとして(今の最初の値が良い「Z」、その後、できるだけ多くのz = 110として返す - の宣言を参照してくださいローカル変数 - 再帰呼び出しとして)。私は本当にこれの解決策を見つけることができません、私はそれが同じ原則に基づいているので、私は仮定反復を使用することはできません。

提案がありますか?事前に感謝します

+0

あなたの機能は何ですか? – khelwood

+0

たぶん私はちょうど何かを逃している(私はちょうど今日最初のコーヒーを取得しようとしている) - あなたのコードではどこに 'x'と 'y'がありますか?あなたはそれを使ってあなたの関数を呼び出しますが、関数内でそれをどのように変更するかはわかりません。それは世界的に宣言されていますか? –

+0

@barakmanosロボットアームと超音波センサーに基づいているため、コードの一部が省略されています。私は簡単にするためにそれを含めなかった。 zが小さくて70より小さければ、関数に何か問題があるので関数を再度呼び出します。 – LDG

答えて

1

私は刺すでしょう。たぶんそれはあなたが探しているものです。

def function(x, y): 

    count = 0 
    z = 110 
    global input 

    try: 
     input = int(serial_port.readline()) 
    except: 
     return function(x,y) 


    if z < 70 or input <= 116: 
     return function(x, y) 

    else: 
     count = count + 1 
     if count == 5: 
      z = z - 1 
      count = 0 
      # do something 

    return z 
+0

ありがとう私は本当に愚かで、関数への呼び出しを返さなかった。 – LDG

+0

ハッピーズ、幸せに助けてください! ;-) –

0

あなたのコードから正確には何をしようとしているのか分かりません。しかし、再帰を回避アウトラインコードは次のようになります。

while True: 
    try: 
     value = get_input() 
    except ValueError: 
     # print an error message about value, if not already done 
     continue # have another go at getting valid input 
    except EOFError: 
     break # get out of the infinite loop 

    # do something with value 

get_input(必要ならば)、それはデータの終わりまたは「終了」または何を検出したときに、それが不正な入力が供給されraise ValueError、およびraise EOFErrorます。

重要な点:例外的なケースを最も便利な場所(ここでは、条件を検出して発生させるコードの「上」)で処理するために例外を使用します。

関連する問題