Подтвердить что ты не робот

Рекурсия с замыканиями в Groovy 2.1.9

Мне не удается вызвать рекурсивное закрытие в Groovy 2.1.9

def facRec = {long n->
    return n>1 ? n * facRec(n - 1) : 1
}

Я получаю TypeMissmatch

4b9b3361

Ответ 1

Когда замыкание определено, оно не имеет понятия о переменной facRec, поскольку она еще не определена...

Вы можете сделать:

def facRec
facRec = {long n->
    return n>1 ? n * facRec(n - 1) : 1
}

Чтобы обойти это, или вы можете обернуть внутреннее в другое закрытие и вызвать владельца этого внутреннего закрытия (хотя я бы старался сделать это выше, поскольку его легче читать):

def facRec = {long n->
    { -> n > 1 ? n * owner.call( n - 1 ) : 1 }()
}

Следует отметить, что оба этих параметра будут терпеть неудачу при больших значениях n, поскольку вы переполните стек

Вы можете использовать батут, чтобы обойти это:

def facRec
facRec = { n, count = 1G ->
    n > 1 ? facRec.trampoline( n - 1, count * n ) : count
}.trampoline()