我正在尝试自学python,并且一旦它进行递归就会遇到困难。我已经完成了经典的递归函数(factorial,fibonacci数字......)但是我回过头来看旧代码并尝试将我的大多数迭代函数转换为递归函数进行练习。
这是我遇到过的墙:
我一会儿制作了一个地牢爬行器,我试图替换一个for循环,我用它来揭示我的精灵附近的方块。因此,当放置精灵时,他/她会看到他/她所在的瓷砖以及相邻和对角线方块(总共9个,包括化身所在的那个)。构成房间的其他瓷砖被隐藏。我认为这是视角半径1.对于视图半径2,我希望char看到半径为1的正方形加上与这些图块相邻的所有图块。当时我无法弄清楚如何使用for循环来实现它,所以我只是实现了一个更简单的方案。
我觉得这个可见性函数可以递归编写,但是我很难想出一个基本案例以及我的递归步骤。我的for循环只取了avatar pos并迭代了一个范围到avatar pos + radius,我为x,y坐标做了那个。
至于将其转换为递归函数,我真的很困惑。我做了很多搜索试图获得领先,但只提出了复杂的主题,例如:FOV使用递归阴影投射,这是超出我的。
非常感谢任何帮助。
答案 0 :(得分:1)
我发现在单词中表达递归有很大帮助。算法所说的基本上是“在半径N处可见的是从半径N-1可见的”。就像,呃,边缘变大了。
答案 1 :(得分:0)
这样的事情怎么样:
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
时,你就会提供一个空集:
visible(pos, radius, set())
seen
集合也可以初始化以实现战争迷雾(或至少奇怪的不可见的方格;))...