这个函数可以被认为是尾递归吗?

问题描述:

这里是我的功能:这个函数可以被认为是尾递归吗?

//Data Structures : 
    abstract class HuffmanTree 
    case class Node(left: HuffmanTree, right: HuffmanTree, chars: List[Char], weight: Int) extends HuffmanTree 
    case class Leaf(char: Char, weight: Int) extends HuffmanTree 


    def find_char(tree: HuffmanTree, x: Char, accu: List[Int]): (Boolean, List[Int]) = { 
    tree match { 
     case Leaf(c, _) => ((x == c),accu) 
     case Node(left, right, ll, _) => 
     (find_char(left, x, accu ::: List(0))._1 || find_char(right, x, accu :::List(1))._1, accu); 
    } 
    } 

功能需要一个哈夫曼树,字符和累加器。该函数的目的是搜索huffman树中的字符并对其进行编码。所以我遍历树,当我向左走时,我向累加器加0,当我向右走时,我向累加器加1。

我想知道这个函数是否是尾递归?

我也有另一个问题。当我到达Leaf时,返回的累加器总是空的。有人可以解释我为什么有这个问题吗?

+0

我回答了第一部分。您的代码目前包含语法错误。因此很难说出它有什么问题。 – Nicolas

+0

只需纠正语法错误。对于第二部分,返回累积器是空的。 – Dimitri

+0

最后一行仍然有一个括号不匹配。如果我理解得很好,你的问题就来自它。你能复制/粘贴你的实际代码吗? – Nicolas

一般提示:可以使用@tailrec注释来检查方法是否是递归的。

基本上在你的情况下,这是不是尾递归:在Node情况下,有两个递归调用之间的||操作。

考虑到空列表Int。很简单:无论如何你都会返回原始值accu。如果您使用空列表作为第二个参数调用find_char,则不能获得除空列表之外的其他内容。

+0

即使我在递归调用中更新累加器值? – Dimitri

+0

列表是不可变的。没有副作用。你不会“更新”累加器。你创建一个**新的**,使用原始的和一个元素的列表。 – Nicolas

+0

通过更新,我的意思是添加一个新元素到列表中,我完全明白这一点。但是我通过在累加器中添加一个新元素来进行递归调用。所以当我到达时,累加器在遍历树时必须全部为0和1。不是吗? – Dimitri