我认为这已经是尾递归了。但如果不是我怎么做到的呢?

时间:2015-03-14 19:09:29

标签: recursion groovy tail-recursion

不同意这个问题的最佳标题,我同意。但我无法想出别的东西。遗憾。

在Groovy中编写一个简单的单链接列表代码,我想添加一个方法,该方法接收两个列表并将右侧列表附加到左侧列表中。这就是我的想法。

private static class Node {
    Node next = null
    def head

    @TailRecursive
    Node append(Node left = this, Node right) {
        if (!right) return left
        if (!left) return right

        if (!left.next) left.next = right
        else left.next = append(left.next, right)

        return left
    }
}

但是我收到了错误,

LinkedList.groovy: 23: Recursive call could not be transformed by @TailRecursive. Maybe it's not a tail call.
 @ line 23, column 30.
               else head.next = append(head.next, tail)

是否因为返回语句到底是不是尾递归?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

基于提示user2864740,这里是尾递归实现。它应该与我在问题中发布的非尾递归一样有效。

@TailRecursive
Node append(Node prevTail = this, Node tail = this?.next, Node right) {
    if (!right) return left
    if (!prevTail) return right

    if (!tail) prevTail.next = right
    else return append(tail, tail?.next, right)
}

答案 1 :(得分:0)

如下所示就足够了吗?

import groovy.transform.TailRecursive

@TailRecursive
LinkedList mergeLinkedList(LinkedList left = [], LinkedList right = []) {
    if ( !left ) {
        right
    } else if ( !right ) {
        left
    } else {
        left.add( right.head() )
        mergeLinkedList( left, right.tail() ) 
    }
}

def left = (1..100) as LinkedList, right = (200..500) as LinkedList

assert mergeLinkedList( left, right ) == ((1..100) + (200..500)) as LinkedList