2014-10-11 318 views
0

我寫了一個函數來確定顯示的高度,給定一個寬度和格式。該函數遞歸運行,如果它在嘗試出一行高度值時找不到給定寬度和格式的匹配。如果函數在進入遞歸之前發現匹配,那麼該函數將起作用,但在此之後,它始終返回無,而不是匹配的值對。對於這是爲什麼我很困惑。我在這裏錯過了一些原則嗎?函數返回無遞歸

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

哦,謝謝。那麼在這裏的確對我有一個基本的缺乏理解...因爲,我不明白爲什麼這個調用需要返回語句,如果返回值在被調用的函數內。 – 2014-10-11 18:12:59

+1

@ user3578468:想象在這個時候調用一個*不同的函數*;比如說你調用了'set([float(width)-1,FormatX,FormatY])'。如果你錯過了「回報」,你認爲會發生什麼?調用遞歸函數在這裏沒什麼不同,你仍然需要返回結果。 – 2014-10-11 20:00:19

+0

我明白了,非常感謝。 – 2014-10-11 22:08:53