Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 简单函数的尾部调用优化抛出错误_Scala_Functional Programming_Tail Recursion - Fatal编程技术网

Scala 简单函数的尾部调用优化抛出错误

Scala 简单函数的尾部调用优化抛出错误,scala,functional-programming,tail-recursion,Scala,Functional Programming,Tail Recursion,我有一个构建树的简单方法: @tailrec final def buildTree (X:DenseMatrix[Double], Y:DenseVector[Double], minBucket:Int):Node = { // Get the split variable, split point and data val (splitVar, splitPoint, leftX, leftY, rightX, rightY) = chooseSp

我有一个构建树的简单方法:

    @tailrec final def buildTree (X:DenseMatrix[Double], Y:DenseVector[Double], minBucket:Int):Node = {
        // Get the split variable, split point and data 
        val (splitVar, splitPoint, leftX, leftY, rightX, rightY) = chooseSplit(X, Y, minBucket);
        // If we couldn't find a split, then we have a leaf
        if(splitVar == Double.NegativeInfinity){
            new Node(Y)
        }else{
            // Otherwise recursively build the children and create yourself as a vertex
            val left = buildTree(leftX, leftY, minBucket)
            val right = buildTree(rightX, rightY, minBucket)
            new Node(Y, splitVar, splitPoint, left, right)
        }
但是,当我开始编译时,我得到:
无法优化@tailrec注释的方法buildTree:它包含一个不在尾部位置的递归调用


我在OCaml中做过类似的事情,没有任何问题。这有什么办法吗

我认为错误信息非常清楚:您的方法既不是
private
也不是
final
,因此它可以被重写,因此不能保证对
buildTree
的调用将转到相同的方法。方法需要是
私有
最终

但是,即使是
private
final
,递归调用也不在尾部位置


基本上,您的尾部递归调用既不是尾部调用,也不保证是递归的。

请参阅的答案。很好,我没有注意到它甚至在理论上不是尾部递归的。我已经更新了问题。这在OCaml中没有任何问题。我的问题是如何让scala执行优化(这并不复杂)。好吧,让尾部递归的策略是众所周知的:添加累加器,转换为连续传球方式,使用蹦床,…@dave当你说的时候“在OCaml中没有任何问题,您的意思是OCaml会自动将非尾部递归函数转换为尾部递归的版本吗?”?你的函数并不像写的那样是尾部递归的。什么优化?它不是尾部递归,也不进行尾部调用。您认为OCaml到底优化了什么?