2015-11-08 1 views
1

Я пытался опробовать вызов программирования, который я нашел, вы можете найти его here, если вы хотите точно знать, что это за требования, но что я ' m в основном пытается сделать, чтобы получить минимально возможное кратное последовательности Фибоначчи, которое содержит заданное число. Таким образом, вход 13 будет выводить [0, 1, 1, 2, 3, 5, 8, 13]. Вход 6 будет выводить [0, 2, 2, 4, 6].(Java) Попытка использовать ArrayList для создания кратных последовательности Fibonacci и сбоев

Мой код отлично работает для любого числа в регулярной последовательности Фибоначчи, но для любого его нескольких выходов, например, если вход 16, [0, 16], и я не могу понять, почему. Любая помощь будет широко оценена.

import java.util.Scanner; 
import java.util.ArrayList; 

public class FibonacciMultiples{ 
    public static void main(String args[]){ 

     int target; 
     ArrayList<Integer> x = new ArrayList<Integer>(); 
     x.add(0); 


     Scanner input; 
     input = new Scanner(System.in); 

     System.out.println("Please enter target: "); 
     target = input.nextInt(); 

     int i = 0; 
     int j = 1; 
     int k = 1; 

     while(x.get(i) != target){ 
      x.add((j*k) + x.get(i)); 
      i++; 
      j = x.get(i-1); 

      if(x.get(i) > target){ 
       x.clear(); 
       x.add(0); 
       i=0; 
       j=1; 
       k++; 
      } 
     }; 

     System.out.println(x); 


    } 
} 
+0

было бы очень полезно, если вы дали значимые имена переменных. Я предполагаю, что k является изменяющимся значением f (1)? и в чем смысл 'x.add ((j * k) + x.get (i));'? установка нового значения в фибоначчи seq shuld будет такой же простой, как «x.add (x.get (x.size() - 2) + x.get (x.size() - 1));' –

ответ

1

Проблема здесь:

j = x.get(i-1); 

Берешь j для следующей итерации из списка, а значит, уже умноженная на k.

Затем умножьте его снова к здесь:

x.add((j*k) + x.get(i)); 

Один из способов исправить это изменить

j = x.get(i-1); 

в

j = x.get(i-1)/k; 

EDIT:

Намного более элегантное решение wi го не умножений или разделов:

while(x.get(i) != target){ 
     x.add(j + x.get(i)); 
     i++; 
     j = x.get(i-1); 

     if(x.get(i) > target){ 
      x.clear(); 
      x.add(0); 
      i=0; 
      j=k; // this is the key 
      k++; 
     } 
    }; 

Теперь первые элементы в последовательности инициализируется 0 и к, что означает каждый элемент будет к раз больше, чем соответствующий элемент в исходной последовательности.

Выход 16:

[0, 2, 2, 4, 6, 10, 16] 
+0

Спасибо за ответ , который, кажется, работает отлично. Хотя я немного смущен относительно того, с чем начиналась проблема, честно говоря, когда я умножал j и k вместе. Я не назначал новое значение j, так почему мне пришлось делить на k позже? –

+0

@DavidLawlor Когда вы назначаете 'j' последнее значение из списка -' j = x.get (i-1); '- это значение уже было умножено на' k', когда вы добавили его в список, и вы умножьте его снова, когда вы вычислите следующее значение для добавления в список. – Eran

+0

@DavidLawlor Обратите внимание на мое второе решение, которое не требует каких-либо умножений или делений. Это более эффективно и элегантно. – Eran

1

еще более элегантное решение (ИМО) заключается в следующем:

public static void main(String[] args) 
{ 
    int target; 
    Scanner input; 
    input = new Scanner(System.in); 
    System.out.println("Please enter target: "); 
    target = input.nextInt(); 

    List<Integer> fibonacciList = new ArrayList<>(); 
    int f1 = 1; // f1 starts at 1 and is increased until found a match 
    do { 
     fibonacciList = fibonacci(f1++, target); 
    } while (fibonacciList.get(fibonacciList.size()-1) != target); 

    System.out.println(fibonacciList); 
} 

// calculate fibonacci with given f(1) value until 
// target is reached (or passed) 
public static List<Integer> fibonacci(int f1, int target) 
{ 
    List<Integer> fibonacciList = new ArrayList<>(); 
    // seed the list with given arg 
    fibonacciList.add(0); 
    fibonacciList.add(f1); 

    while (fibonacciList.get(fibonacciList.size()-1) < target) { 
     // build the list by adding last two items 
     fibonacciList.add(
       fibonacciList.get(fibonacciList.size()-2) + 
       fibonacciList.get(fibonacciList.size()-1)); 
    } 
    return fibonacciList; 
} 
+0

Большое спасибо за ваш ответ, работает просто отлично. Я займу некоторое время, чтобы окунуться в него, если мне когда-нибудь понадобится сделать что-то подобное в будущем! –