快速理解递归中的返回类型:什么时候应该返回函数,而不是只返回函数本身



对于这个论坛来说,这可能有点过于笼统,但希望有人能以一种对我的大脑有意义的方式解释这一点。我试着阅读和研究,发现了很多例子,但我仍然不理解";为什么";这意味着我不完全理解程序是如何从函数返回的。

下面是我编写的一个非常简单的函数,它使用向后递归解决了一个难题。它运行良好。

func solver(grid: [[Int]])->[[Int]] {  
var returnGrid = constraintPropogation(grid: grid)
if contradictionCheck(grid: returnGrid) == false {
return returnGrid
} else {
if returnGrid.flatMap({$0}).filter({$0 == 3}).count == 0 {
print("SOLVED**********")
gridPrint(grid: returnGrid)
print()
stopFlag = true
stopAnswer = returnGrid
return returnGrid
} else {
let randStart = getRandomStart(grid: returnGrid)
returnGrid[randStart.x][randStart.y] = 0
solver(grid: returnGrid)
returnGrid[randStart.x][randStart.y] = 1 
solver(grid: returnGrid)
}   
}
if stopFlag == true {return stopAnswer}
return solver(grid: returnGrid)
} 

我的问题是了解回报。在函数的第三行,如果矛盾检查失败,这意味着我们已经走上了一条不可能的道路。所以我们回来了。这是有道理的。函数中间的第二个返回发生在解谜时,因此返回那里是有意义的。但最后一个";return solver(grid:returnGrid(";挑战了我的理解。在这里,我们返回,但也再次调用相同的函数。这并没有深入到潜在的解决方案路径(发生在调用函数的"else"部分(。为什么我们需要再次调用函数而不是返回?引擎盖下面发生了什么?返回是否首先发生在我们";弹出一个级别";然后我们再次有效地调用函数,在堆栈上高出一级?当我写下这些单词时,我意识到我有一个模糊的理解——但不知何故,对我来说,这并不是全部

现在,当我编写涉及递归的函数时,我只是尝试自己返回,或者再次返回并调用函数,看看哪一个实现了我想要的。但我真的很想了解它,而不仅仅是猜测。如果有人能给我一个简单的解释,我将不胜感激

函数解算器获取一个数组数组,并返回一个数组。任何返回(某物(的调用都会将该某物返回给调用者。

return(someArrayOfArrays)意味着你已经完成了,并且有了结果。

说CCD_ 2说";再次调用此函数,传递一个新值。将结果作为函数结果返回"对solver()的当前调用完成了工作,并将其中间结果传递给对该函数的另一个调用。这就是递归。您可以将此视为在函数调用内部的函数调用中嵌套函数调用,或者将函数调用堆叠在一起。

solver(grid: returnGrid)的调用没有任何意义。这是一个递归调用,但您忽略了结果。因此,这一呼吁毫无用处。如果你去掉那条线,对结果不会有任何影响。那句话是在说";去做一堆工作,为我找到答案,但我会扔掉你的答案"。编译器应该给你一个";函数结果被忽略";在那条线上发出警告。

除此之外,我不知道你的代码在做什么。它似乎正在修改至少一个全局变量"0";stopAnswer";。这表明它不是一个纯粹的递归函数。

最新更新