0

我是一名正在研究这个家庭作业问题的学生。该代码试图找到任何给定圆形棋盘游戏的解决方案,其中列表作为参数给出。列表中的值告诉程序顺时针/逆时针移动多远(最后一个元素始终为 0)。

如果该特定难题有解决方案,则该程序旨在返回 True ,否则返回 False 。除了将 0 作为第一个也是唯一的元素的情况下,我的代码即使对于短列表也会返回 RecursionError。我的代码有什么问题?

def solve_puzzle(L): # uses helper for memoization
    visited = set() # visited indices
    return _solve_puzzle(L, visited, 0)

def _solve_puzzle(L, visited, index): # always start at first element
    if L[index] not in visited:
        visited.add(index)
        if L[index] == 0: 
            return True
        else:
            # loop around to the end or start in python
            if L[index] + index >= len(L):
                new_index_add = index + L[index] - len(L)
            else:
                new_index_add = index + L[index]
            
            if index - L[index] < 0:
                new_index_sub = len(L) - L[index] - index
            else:
                new_index_sub = index - L[index]
                
            # need to figure out the indexing - how do we go both backward and forward
            return _solve_puzzle(L, visited, new_index_add) or _solve_puzzle(L, visited, new_index_sub) # True if it's solveable in either direction
        
    return False
4

1 回答 1

0

您可能应该visited = visited.copy()在函数顶部添加。否则,当visited被修改时,每次调用都会修改它,因为集合是可变的。

我可以看到另外两个小错误,但我认为你应该自己解决它们。我不想给你完整的答案,因为这是一项家庭作业。修复它们,它应该可以工作。对不起。

于 2022-02-26T17:13:21.647 回答