2017-02-15 10 views
0

У меня есть маленький вопрос, потому что я действительно не могу найти выход. Является скорее логическим вопросом, чем 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 

То, что я хочу, чтобы получить только один возвращаемое значение, и не так много значения, как рекурсивный вызов (теперь возвращает в первом значении хорошего «г», а затем многие г = 110 - см декларирования локальная переменная - как рекурсивный вызов). Я не могу найти решение этого, я не могу использовать Итерацию, я полагаю, потому что она основана на том же принципе.

Любое предложение? Заранее спасибо

+0

Какова ваша функция? – khelwood

+0

Может быть, я просто что-то упустил (сейчас я собираюсь получить первый кофе) - где «х» и «у» в вашем коде? Вы вызываете свою функцию, но я не вижу, как вы меняете ее внутри функции. Объявляется ли оно глобально? –

+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 (при необходимости), когда он обнаруживает конец данных или «бросить» или любой другой.

Ключевой момент: используйте исключения, чтобы иметь дело с исключительными случаями в наиболее удобном месте (здесь, «над» кодом, который обнаруживает и повышает условие).

 Смежные вопросы

  • Нет связанных вопросов^_^