帮助清除分片(视野)的递归函数

2024-05-29 11:11:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图自学python,但在递归方面遇到了困难。我已经完成了经典的递归函数(factorial,fibonacci numbers…),但我将回顾旧代码,并尝试将我的大部分迭代函数转换为递归函数以供实践。在

这是我撞到的墙:

我做了一个地牢爬虫前不久,我试图取代一个for循环,我曾用来揭示我的精灵附近的广场。所以当精灵被放置时,他/她会看到他/她所在的瓷砖以及相邻的和对角的方块(总共9个,包括阿凡达所在的那个),其他组成房间的瓷砖都被隐藏起来了。我认为这是视野半径1。对于视图半径2,我想让char看到半径为1的正方形加上与这些瓷砖相邻的所有瓷砖。当时我不知道如何用for循环来实现它,所以我只实现了一个更简单的方案。在

我觉得这个可视性函数可以递归地编写,但我很难想出一个基本情况和我的递归步骤是什么。我的for循环只获取了avatar pos并在avatar pos+radius的范围内迭代,我对x,y坐标做了这个操作。在

至于把它转换成递归函数,我真的很困惑。我做了很多搜索,试图找到一个线索,但只找到一些复杂的主题,比如:FOV使用递归阴影投射,这是远远超出我的范围。在

任何帮助都将不胜感激。在


Tags: 函数代码posfor半径爬虫fibonacci精灵
2条回答

这样的怎么样:

def visible(pos, radius, seen):
    if radius == 1:
        # base case
        seen.add(...)
        yield ...
    else:
        for center in visible(pos, radius-1, seen):
            for x in visible(center, 1, seen):
                if x not in seen:
                    seen.add(x)
                    yield x

seen将是set。每次从外部调用visible“时,都会提供一个空集:

^{pr2}$

seen集也可以被初始化来实现战争迷雾(或者至少奇怪的是不可见的方块;)。。。在

我发现用单词来表达递归非常有用。这个算法说的基本上是“在半径N处可见的就是在半径N-1处可见的”。就像,呃,边缘变大了。在

相关问题 更多 >

    热门问题