【问题标题】:Recursion in scala wont stopscala中的递归不会停止
【发布时间】:2017-11-20 04:31:49
【问题描述】:

我有一个方法可以帮助我解决骑士之旅。我希望在找到解决方案后立即停止递归,但是它会继续进行。

最后它返回近 20 种不同的解决方案。我在下面添加了我的代码,有人可以指出这里有什么问题吗?

def myRecursion(dimension: Int, solution: Solution) : Option[Solution] = {

    if ( dimension * dimension == solution.size) {
        println("Stop it now")
        Some(solution)
    } else {
        val movesAvailable = possibleMoves(dimension, solution, solution.head) 
        val bestm = bestMoves(movesAvailable)

        if ( bestm.isDefined ) {
            myRecursion(dimension, bestm.get ::: solution)
        } else {
            movesAvailable.foreach{ x => 
                if(myRecursion(dimension, x:: solution).isDefined){
                    x::solution;
                } 
            }
            None

        }
    }
}

【问题讨论】:

  • @RameshMaharjan 不幸的是,这并没有解决我的问题。一旦solution.size 为1,它就会停止。但是当解决方案包含(维度*维度)元素数时,我试图停止它
  • 我的分析错误,维度永远不会增加,但解决方案的大小是。所以它反过来。将维度 * 维度 == solution.size 更改为维度 * 维度
  • @RameshMaharjan 不幸的是,它仍然显示与 "==" 相同的输出

标签: scala recursion knights-tour immutable-collections


【解决方案1】:
movesAvailable.foreach{ x => 
                if(myRecursion(dimension, x:: solution).isDefined){
                    x::solution;
                } 
            }
None

这可能是你的问题。您在循环中递归地调用您的函数,但如果它成功,您实际上并没有退出循环。您可以将其切换为在 myRecursions 返回 None 时继续运行的 takeWhile。

另外,那段代码现在没有做任何事情 - 你有一个 if 语句可以评估某些东西,但无论如何你都会返回 None。

【讨论】:

  • 感谢您的回复。我以为我会在返回 x::solution 时退出循环。如果您必须重写此代码,您会推荐什么解决方案?我肯定会研究 takeWhile 但我不知道如何修复 if 语句
  • 我无法从代码中看出,但大概 moveAvailable 是某种类型的列表? foreach 不是您要在那里使用的功能,因为它的作用是“遍历列表中的每个项目,运行一些功能,然后丢弃结果”。它用于具有副作用的事物,例如 - 将列表中的所有内容打印到控制台。
  • 在这种情况下,takeWhile 更可取。该函数的作用是“查看列表中的项目,评估返回布尔值的函数,如果结果为真,则继续获取更多项目,否则停止”。所以你的代码看起来像 moveAvailable.takeWhile(x => myRecursion(dimension, x:: solution).isEmpty).headOption headOption 表示“获取列表中的第一项”(如果存在)。
  • 您的回答完全有道理,我现在完全理解了,但是在实施您的建议时,我收到关于类型不匹配的错误,“发现:List[Product with Serializable]”
  • “可序列化的产品”通常意味着有多种类型混合在一起。 moveAvailable 的类型是什么?列表[解决方案]?尝试使用类型注释放入中间变量以找出问题所在。
猜你喜欢
  • 2021-04-25
  • 2021-04-15
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 1970-01-01
相关资源
最近更新 更多