function - 在递归函数中保留变量的值,python 3.3

标签 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-左到2-左到5-右到0) 但它一直试图向右走,然后索引超出范围等。

我认为如果你使用 return of 或 this 或 that,它会尝试两者直到达到 True,为什么它在这里不起作用?

谢谢!

最佳答案

包含您想要保留为该方法的默认参数的值,如下所示:

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

这样,如果它已经访问过一个项目,它将决定走与上次相反的方向。另外,如果它遇到一个它不能离开而不出界的项目,或者如果没有办法到达终点,它就会放弃并返回。 p>

编辑:我意识到这个算法有很多缺陷!虽然它比第一种方法更好,但不能保证它一定有效,尽管原因有些复杂。

想象一下这个数组(不重要的元素留空):

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

关于function - 在递归函数中保留变量的值,python 3.3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20006224/

相关文章:

PHP 如何检查自己是否负担得起?

list - 递归定义一元随机数列表 : most idiomatic Haskell and analogous to pure code

java - 通过树递归搜索而不传递对象

c++ - 获取用程序集调用的函数的返回值

function - clojure 函数循环依赖是设计明确禁止的,还是只是读者行为?

javascript - 在多个 Photoshop 文件中查找和替换文本?

java - 为什么我们要在变量名前添加 _(下划线)?

c++ - 调用 `strcat` 并能够将较大的字符串存储到较小的字符串中?

variables - SAS 中的动态变量名称