Python 如何在递归函数中访问此代码?
我正在做一个数独解算器,并在网上找到了这段代码,它使用了与我所做的类似的方法,但我不明白在这段代码中如何达到Python 如何在递归函数中访问此代码?,python,python-3.x,for-loop,if-statement,recursion,Python,Python 3.x,For Loop,If Statement,Recursion,我正在做一个数独解算器,并在网上找到了这段代码,它使用了与我所做的类似的方法,但我不明白在这段代码中如何达到grid[y][x]=0,因为它在前面的行中调用了solve(grid) 我注意到,如果我在它前面放一个else语句(以及如果它的缩进更少),我会得到相同的输出 这是一个递归解决方案。递归意味着solve函数调用自身。当程序从调用返回时,它继续它的代码 grid[y][x] = n # current solve changes grid solve(grid) #
grid[y][x]=0
,因为它在前面的行中调用了solve(grid)
我注意到,如果我在它前面放一个else
语句(以及如果它的缩进更少),我会得到相同的输出
这是一个递归解决方案。递归意味着solve函数调用自身。当程序从调用返回时,它继续它的代码
grid[y][x] = n # current solve changes grid
solve(grid) # call recursively solve
# the function solve has now returned
# and can have changed grid
grid[y][x] = 0 # now the current solve continues
这是因为类似列表的网格是一个可变对象,这意味着被调用的函数可以更改网格,而调用方可以继续更改网格
有一个条件:solve内部必须有一些条件,以便在多次调用自身后,最后一次调用的solve返回
将其与众所周知的斐波那契函数进行比较:
def F(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return F(n - 1) + F(n - 2)
print(F(6))
当n==0或n==1时,它停止调用自己。在此之前,它一直使用n-1和n-2调用自己。这是一个递归解决方案。递归意味着solve函数调用自身。当程序从调用返回时,它继续它的代码
grid[y][x] = n # current solve changes grid
solve(grid) # call recursively solve
# the function solve has now returned
# and can have changed grid
grid[y][x] = 0 # now the current solve continues
这是因为类似列表的网格是一个可变对象,这意味着被调用的函数可以更改网格,而调用方可以继续更改网格
有一个条件:solve内部必须有一些条件,以便在多次调用自身后,最后一次调用的solve返回
将其与众所周知的斐波那契函数进行比较:
def F(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return F(n - 1) + F(n - 2)
print(F(6))
当n==0或n==1时,它停止调用自己。在此之前,它一直用n-1和n-2调用自己。我不明白你有什么毛病——这只是一个普通的函数调用。显然,一个函数可以调用另一个函数,否则我们做不了多少
注意:名称
solve
指向的是在运行时解析的-在编译时发生的唯一事情是生成的字节码知道它必须解析名称solve
,并将调用op应用于该名称解析为的任何名称 我不明白你有什么毛病——这只是一个普通的函数调用。显然,一个函数可以调用另一个函数,否则我们做不了多少
注意:名称
solve
指向的是在运行时解析的-在编译时发生的唯一事情是生成的字节码知道它必须解析名称solve
,并将调用op应用于该名称解析为的任何名称 显而易见的答案:这一行在从solve()
返回后执行。为什么您认为不应该到达它?递归调用与常规调用没有什么不同-一旦调用返回,外部函数将恢复。显而易见的答案:这一行在从solve()
返回后执行。为什么您认为不应该到达它?递归调用与常规调用没有什么不同——一旦调用返回,外部函数就会恢复。是的,我知道。代码没有问题,我只是想了解背后的原理it@IsaacK0我不是说有什么问题,只是没有任何理由怀疑它是如何工作的,也没有任何理由怀疑递归调用为什么会阻止执行下一行。是的,我知道。代码没有问题,我只是想了解背后的原理it@IsaacK0我不是说有什么问题,只是没有任何理由怀疑它是如何工作的,也没有任何理由怀疑递归调用为什么会阻止执行下一行。