我设法做到了,其他方式。 但我有一个问题,我之前有这个代码
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左到左到左到右到右到0) 但它一直试图去正确,然后索引超出范围等。
我认为如果你使用return或this或that,它会尝试两者直到它达到True,为什么它不能在这里工作?
谢谢!
答案 0 :(得分: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]
来获取最后一项。