2014-10-11 4 views
0

Я написал функцию для определения высоты дисплея с учетом ширины и формата. Функция работает рекурсивно, если она не может найти соответствие для заданной ширины и формата при опробовании строки значений высоты. Функция работает, если она находит совпадение перед входом в рекурсию, но после этого она всегда возвращает ни одного, а не пару совпадающих значений. Я очень смущен, почему это так. У меня отсутствует какой-то принцип здесь?Функция возвращает None после рекурсии

def getDisplayDimensions(width,FormatX,FormatY): 
    Format = float(FormatX)/FormatY 
    if FormatX < FormatY: 
     return "illegal format." 
    for height in range(1,int(width)+1): 
     if float(width)/height == float(Format): 
      return width,height 
      break 
     elif height == width: 
      getDisplayDimensions(float(width)-1,FormatX,FormatY) 

# example call: 
print getDisplayDimensions(801,16,9) 

ответ

0

Вы на самом деле не возвращает результат рекурсивного вызова:

elif height == width: 
    getDisplayDimensions(float(width)-1,FormatX,FormatY) 

Добавить return там:

elif height == width: 
    return getDisplayDimensions(float(width)-1,FormatX,FormatY) 

Без return внешний вызов просто заканчивается и возвращает вместо значения по умолчанию None.

Демо:

>>> def getDisplayDimensions(width,FormatX,FormatY): 
...  Format = float(FormatX)/FormatY 
...  if FormatX < FormatY: 
...   return "illegal format." 
...  for height in range(1,int(width)+1): 
...   if float(width)/height == float(Format): 
...    return width,height 
...    break 
...   elif height == width: 
...    return getDisplayDimensions(float(width)-1,FormatX,FormatY) 
... 
>>> print getDisplayDimensions(801,16,9) 
(800.0, 450) 
+0

Ой, спасибо. Тогда действительно существует фундаментальное отсутствие понимания для меня здесь ... Потому что, я не понимаю, почему для вызова нужен оператор return, если возврат находится в вызываемой функции. –

+1

@ user3578468: представьте себе * другую функцию * в этой точке; скажем, вы назвали 'set ([float (width) -1, FormatX, FormatY]) вместо этого. Как вы думаете, что произойдет, если вы пропустили «возвращение»? Вызов рекурсивной функции здесь ничем не отличается, вам все равно нужно вернуть результат. –

+0

Я вижу, спасибо большое. –

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