2013-11-15 112 views
2

我設法做到了,用其他方式。 但我有一個問題,我有這個代碼在遞歸函數中保留變量的值,python 3.3

def jumphunt(start, mylist, count = 0): 
    if count < len(mylist): 
     place = mylist[start] 
     print(place) 
     if place == 0: 
      return True 
     elif start >= len(mylist) or start < 0: 
      return False 
     move_left = (start - place) 
     move_right = (start + place) 
     return jumphunt(move_right, mylist, count+1) or jumphunt(move_left, mylist, count+1) 
    else: 
     return False 

之前,但由於某種原因,它沒有試圖左右逢源 才能到名單上的最後一個項目。

例如:[1,2,2,3,4,5,3,2,1,7,0]和,start = mylist [0] 它應該像這樣跳轉(從1-2 -4-1-左到左2-5右到0) 但它一直試圖去右鍵,然後索引超出範圍等

我認爲,如果你使用返回或這或那,它會嘗試兩個,直到它達到真,爲什麼它不會在這裏工作?

謝謝!

+0

int是什麼?您不應該使用這樣的變量名稱,因爲它是許多語言中的類型關鍵字,並且會混淆人們。 – AJMansfield

回答

1

包括你想保持作爲方法的默認參數的值,如:

def my_func(int, list, i=0): 
    a = (i + int) 
    if int == 0: 
     return True 
    elif a > len(list): 
     i -= int 
    else: 
     i += int 
    int = list[i] 
    my_func(int, list, i) 

請記住,它甚至有可能不會總是能夠在列表的末尾做抵達你描述的跳躍模式,即使有可能,這種方法可能會選擇錯誤的分支。

更好的算法是這樣的:

def branching_search(list, start): 
    marks = [0]*len(list) 
    pos = start 
    while list[pos]!=0: 
     marks[pos]++ 
     if marks[pos] % 2 == 0 and pos + list[pos] < len(list): 
      pos += list[pos] 
     elif marks[pos] % 2 == 1 and pos - list[pos] >= 0: 
      pos -= list[pos] 
     else: 
      return False 
     if all(item == 0 or item > 1 for item in list) 
      return False 
    return True 

這樣,如果它來,它已經訪問了一個項目,它會決定去相反的方向,它走到最後一次。另外,如果涉及的項目不是不能在之外離開,或者如果沒有辦法走到最後,它會放棄並返回。

編輯:我意識到這個算法有一些缺陷!雖然它比第一種方法更好,但不能保證工作,但原因有些複雜。

試想一下,這個陣列(不重要的元素留空):

1, 2, , 5, , , , , 5, 0 

前兩個元素會得到只有一個標記(所以環形檢查情況將無法正常工作),但它仍然會被卡住在兩個五之間循環。

這裏是一個總能工作的方法:

def flood_search(list): 

    marks = [[]]*len(list) 
    marks[0] = [0] 
    still_moving = True 

    while still_moving: 
     still_moving = False 

     for pos in range(0,len(list)): 
      if marks[pos]: 
       if pos + list[pos] < len(list) and not marks[pos + list[pos]]: 
        marks[pos + list[pos]] = marks[pos] + [list[pos]]; 
        pos += list[pos] 
        still_moving = True 

       if pos - list[pos] >= 0 and not marks[pos - list[pos]]: 
        marks[pos - list[pos]] = marks[pos] + [-list[pos]]; 
        pos -= list[pos] 
        still_moving = True 

    return marks[-1] 

這是通過在同一時間服用每可能分支

您也可以使用該方法來獲取實際採取的路線以結束。它仍然可以作爲條件使用,因爲如果找不到路徑(虛假值),它將返回一個空列表,如果找到路徑(真值),則返回包含路徑的列表。

但是,您始終可以使用list[-1]獲取最後一項。

+0

我只使用int,在這裏例如它可以是任何int。 – Mumfordwiz

+0

@dav_sap那會是因爲你沒有用'i'作爲參數調用'my_func'。 – AJMansfield

+0

是的,我得到它的工作,但它並沒有給我完全我所需要的,但也許這是我的代碼, – Mumfordwiz