package com.fr.plugin.function.fib; import com.fr.general.GeneralUtils; import com.fr.intelli.record.Focus; import com.fr.intelli.record.Original; import com.fr.record.analyzer.EnableMetrics; import com.fr.script.AbstractFunction; import com.fr.stable.ArrayUtils; import com.fr.stable.Primitive; @EnableMetrics public class Fibonacci extends AbstractFunction { @Override @Focus(id = "com.fr.plugin.function.fib", text = "", source = Original.PLUGIN) public Object run(Object[] args) { if (ArrayUtils.isEmpty(args)) { return Primitive.ERROR_VALUE; } int n = GeneralUtils.objectToNumber(args[0]).intValue(); if (n < 0) { return Primitive.ERROR_VALUE; } return getFib(n); } private int getFib(int n) { if (n < 0) { return -1; } else if (n == 0) { return 0; } else if (n == 1 || n == 2) { return 1; } else { int[] fibAry = new int[n + 1]; fibAry[0] = 0; fibAry[1] = fibAry[2] = 1; for (int i = 3; i <= n; i++) { fibAry[i] = fibAry[i - 1] + fibAry[i - 2]; } return fibAry[n]; } } }