/**
* 阶乘计算 -- 递归解决
*
* @param number 当前阶乘需要计算的数值
* @return number!
*/
public static int factorialRecursion(final int number) {
if (number == 1) return number;
else return number * factorialRecursion(number - 1);
}
/**
* 阶乘计算 -- 尾递归解决
*
* @param factorial 上一轮递归保存的值
* @param number 当前阶乘需要计算的数值
* @return number!
*/
public static int factorialTailRecursion(final int factorial, final int number) {
if (number == 1) return factorial;
else return factorialTailRecursion(factorial * number, number - 1);
}
/**
* 尾递归函数接口
* @author : martrix
*/
@FunctionalInterface
public interface TailRecursion<T> {
/**
* 用于递归栈帧之间的连接,惰性求值
* @return 下一个递归栈帧
*/
TailRecursion<T> apply();
/**
* 判断当前递归是否结束
* @return 默认为false,因为正常的递归过程中都还未结束
*/
default boolean isFinished(){
return false;
}
/**
* 获得递归结果,只有在递归结束才能调用,这里默认给出异常,通过工具类的重写来获得值
* @return 递归最终结果
*/
default T getResult() {
throw new Error("递归还没有结束,调用获得结果异常!");
}
/**
* 及早求值,执行者一系列的递归,因为栈帧只有一个,所以使用findFirst获得最终的栈帧,接着调用getResult方法获得最终递归值
* @return 及早求值,获得最终递归结果
*/
default T invoke() {
return Stream.iterate(this, TailRecursion::apply)
.filter(TailRecursion::isFinished)
.findFirst()
.get()
.getResult();
}
}
/**
* 使用尾递归的类,目的是对外统一方法
*
* @author : Matrix
*/
public class TailInvoke {
/**
* 统一结构的方法,获得当前递归的下一个递归
*
* @param nextFrame 下一个递归
* @param <T> T
* @return 下一个递归
*/
public static <T> TailRecursion<T> call(final TailRecursion<T> nextFrame) {
return nextFrame;
}
/**
* 结束当前递归,重写对应的默认方法的值,完成状态改为true,设置最终返回结果,设置非法递归调用
*
* @param value 最终递归值
* @param <T> T
* @return 一个isFinished状态true的尾递归, 外部通过调用接口的invoke方法及早求值, 启动递归求值。
*/
public static <T> TailRecursion<T> done(T value) {
return new TailRecursion<T>() {
@Override
public TailRecursion<T> apply() {
throw new Error("递归已经结束,非法调用apply方法");
}
@Override
public boolean isFinished() {
return true;
}
@Override
public T getResult() {
return value;
}
};
}
}
/**
* 阶乘计算 -- 使用尾递归接口完成
* @param factorial 当前递归栈的结果值
* @param number 下一个递归需要计算的值
* @return 尾递归接口,调用invoke启动及早求值获得结果
*/
public static TailRecursion<Integer> factorialTailRecursion(final int factorial, final int number) {
if (number == 1)
return TailInvoke.done(factorial);
else
return TailInvoke.call(() -> factorialTailRecursion(factorial + number, number - 1));
}
/**
* 阶乘计算 -- 尾递归解决
*
* @param factorial 上一轮递归保存的值
* @param number 当前阶乘需要计算的数值
* @return number!
*/
public static int factorialTailRecursion(final int factorial, final int number) {
if (number == 1) return factorial;
else return factorialTailRecursion(factorial * number, number - 1);
}
@Test
public void testRec() {
System.out.println(factorialRecursion(100_000));
}
java.lang.StackOverflowError at test.Factorial.factorialRecursion(Factorial.java:20) at test.Factorial.factorialRecursion(Factorial.java:20) at test.Factorial.factorialRecursion(Factorial.java:20) at test.Factorial.factorialRecursion(Factorial.java:20) at test.Factorial.factorialRecursion(Factorial.java:20) Process finished with exit code -1
public static TailRecursion<Long> factorialTailRecursion(final long factorial, final long number) {
if (number == 1)
return TailInvoke.done(factorial);
else
return TailInvoke.call(() -> factorialTailRecursion(factorial + number, number - 1));
}
@Test
public void testTailRec() {
System.out.println(factorialTailRecursion(1,10_000_000).invoke());
}
50000005000000 Process finished with exit code 0
public static long factorial(final long number) {
return factorialTailRecursion(1, number).invoke();
}
@Test
public void testTailRec() {
System.out.println(factorial(10)); //结果为 3628800
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有