将变量的值保存在递归函数中,python 3.3

时间:2013-11-15 16:46:56

标签: function variables recursion

我设法做到了,其他方式。 但我有一个问题,我之前有这个代码

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,为什么它不能在这里工作?

谢谢!

1 个答案:

答案 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]来获取最后一项。