美文网首页
Java 尾递归

Java 尾递归

作者: xytutu | 来源:发表于2018-04-20 10:06 被阅读0次
import java.math.BigDecimal;
import java.util.stream.Stream;

public class TailSelf {
    public static void main(String[] args) {
        System.out.println(factorial(1000000));
    }

    public static String factorial(final long number) {
        return tailRecursion(number, new BigDecimal(1)).invoke().toString();
    }

    private static TailLoop<BigDecimal> tailRecursion(long n, BigDecimal total) {
        if (n == 1) {
            return new TailLoop<BigDecimal>() {
                @Override
                public TailLoop<BigDecimal> functionalMethod() {
                    return null;
                }

                public BigDecimal result() {
                    return total;
                }
            };
        }
        return () -> tailRecursion(n - 1, total.multiply(new BigDecimal(n)));
    }

    @FunctionalInterface
    interface TailLoop<T> {

        TailLoop<T> functionalMethod();

        default T result() {
            return null;
        }

        default T invoke() {
            // 惰性求值
            return Stream.iterate(this, TailLoop::functionalMethod).filter((loop) -> loop.result() != null).findFirst()
                    .get().result();
        }
    }

}

知识点

  • 尾递归
  • 惰性求值
  • java8 : lambda Stream
  • 柯里化

相关文章

网友评论

      本文标题:Java 尾递归

      本文链接:https://www.haomeiwen.com/subject/ndhakftx.html