Since Groovy 1.8 we can use the trampoline
method for a closure to get better recursive behavior for tail recursion. All closure invocations are then invoked sequentially instead of stacked, so there is no StackOverFlowError
. As from Groovy 2.3 we can use this for recursive methods as well with the @TailRecursive
AST transformation. If we apply the annotation to our method with tail recursion the method invocations will be sequential and not stacked, like with the closure's trampoline
method.
1 2 3 4 5 6 7 8 9 10 11 12 13 | import groovy.transform.TailRecursive @TailRecursive long sizeOfList(list, counter = 0 ) { if (list. size () == 0 ) { counter } else { sizeOfList(list.tail(), counter + 1 ) } } // Without @TailRecursive a StackOverFlowError // is thrown. assert sizeOfList( 1 .. 10000 ) == 10000 |
Code written with Groovy 2.3.