2016-04-17 45 views
-1

我想在Python中做一個遞歸程序,它返回與它的值相等的列表的第一個索引,例如:[0,1,5, 6]返回0.但是,當我通過最後一個列表時,它返回1,我不知道爲什麼。返回列表[i] =我列表的索引

代碼:

def index(list): 
    """Returns the first index of the list where list[i] == i""" 
    return __auxindex(list, 0, len(list) - 1) 


def __auxindex(list, start, end): 
    if start < end: 
     half = (start + end) // 2 
     if list[half] == half: 
      return half 
     elif list[half] > half: 
      return __auxindex(list, start, half) 
     else: 
      return __auxindex(list, half + 1, end) 
    else: 
     return start 

list = input('Values (,): ').split(', ') 
list = [int(i) for i in list] 
print(index(list)) 

編輯:我忘了,名單必須訂購。所以這段代碼有效。

+0

它*總是*做到這一點,或只爲某些投入?如果後者,哪個?無論哪種情況,它應該返回什麼? –

+0

它有時,第一次當我通過[0,1,5,6]它返回0,但是當我再次返回1 –

+1

不要使用列表作爲變量名稱,也如果沒有元素它在一個匹配索引?另外我得到1代表'[0,1,5,6]'不是0 –

回答

3

您在中途點開始索引。由於您使用的是樓層劃分,因此會在索引1。那麼,您在索引1上的列表是1,所以這是一個匹配,它返回half,1。你需要做的是從一開始就開始並且結束。像這樣的東西:

def index(number_list, start=0): 
    if start >= len(number_list): 
     return -1 
    elif number_list[start] == start: 
     return start 
    else: 
     return index(number_list, start+1) 
+0

確實如此,但OP需要遞歸解決方案。我認爲你被拒絕了,因爲你的解決方案不是遞歸的。 –

+0

我很困惑,Python中的遞歸工作方式與Java相似嗎? –

+0

@MarcoCanora:對不起。我沒有注意到*遞歸*。儘管如此,你仍然應該從一開始就開始工作到最後。我編輯過。 – zondo