美文网首页
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