2015-08-03 9 views
4

числа Люка являются числами в последовательности, определенной следующим образом:Как рассчитать номер Лукаса?

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.

ответ

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);

более быстрые алгоритмы

Ваш алгоритм является алгоритмом О (п), который является медленным для больших п. Вы можете сделать это быстрее.

+0

Okey, tks! Подобно @pbabcdefp – Khuong

+0

Я знаю, он бил меня за секунды. :( – Rohcana

+0

Есть ли какой-либо способ быстрее с сортировкой завершенное время? – Khuong

2

Изменить

return lucasnum(n + 1) - lucasnum(n + 2); 

в

return lucasnum(n + 2) - lucasnum(n + 1); 
+0

Tks! Решаемые. Кстати, есть ли способ быстрее? – Khuong

+1

@ khuong291 Выражение матрицы (записи для Fibonacci, но могут быть легко адаптированы). –

+1

@ khuong291 Обычный способ ускорить это - положить результаты в массив или карту, чтобы одни и те же ответы не вычислялись повторно. Поиск вопросов по memoization. –