Java 尾递归

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
  • 柯里化
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容