卢卡斯数是一个如下定义的序列中的数字:
L(n) = 2 if n = 0
L(n) = 1 if n = 1
,否则
L(n) = L(n - 1) + L(n - 2)
这是我的代码:
public class Lucas {
public static int lucasnum(int n) {
if (n >= 0) {
if (n == 0)
return 2;
else if (n == 1)
return 1;
else
return lucasnum(n - 1) + lucasnum(n - 2);
}
else{
if (n == 0)
return -2;
else if (n == -1)
return -1;
else
return lucasnum(n + 1) - lucasnum(n + 2);
}
}
public static void main(String[] args) {
System.out.println(Lucas.lucasnum(-5));
}
}
但我有一些负数的问题。如果n == -5
它必须返回-11
,但上面的代码会返回3
。
答案 0 :(得分:3)
我认为你得到了负指数的公式。
由于,
L(n+2)=L(n+1)+L(n)
=>
L(n)=L(n+2)-L(n+1)
所以,改变
return lucasnum(n + 1) - lucasnum(n + 2);
到
return lucasnum(n + 2) - lucasnum(n + 1);
更快的算法
您的算法是一种O(n)算法,对于大n来说速度很慢。你可以更快地完成它。
O(1)。使用Binet's Formula for Lucas Numbers,但是,由于固定精度浮点运算,这不会给出大的n值的精确结果。
使用递归的O(log n):
设f(n)为斐波纳契数列
f(0) = 0, f(1) = 1,
f(n) = f(n-1) + f(n-2)
使用递归计算O(log n)时间内的斐波纳契数:
f(2n-1) = f(n)^2 + f(n-1)^2
f(2n) = f(n)^2 + 2*f(n-1)*f(n)
然后使用以下方法计算Lucas数:
L(n) = f(n-1) + f(n+1)
您可以在此处找到公式:
答案 1 :(得分:2)
更改
return lucasnum(n + 1) - lucasnum(n + 2);
到
return lucasnum(n + 2) - lucasnum(n + 1);