итеративный алгоритм для Fibonacci, потому что для меня это закрепило то, что самый изящный код (в этом случае, рекурсивная версия) является не обязательно самым эффективным.
повторяющийся метод, (воркуют = prev1 + prev2 в forloop) не делает дерева этот путь, и при этом это не берет в качестве большой памяти, так как это - только 3 переходных переменные вместо кадров n в стопке рекурсии.
Вы знаете, что fibonacci имеет закрытое решение для формы, которое позволяет прямое вычисление результата в постоянном числе шагов, правильно? А именно, (phi <глоток> n глоток> - (1 - phi) <глоток> n глоток>) / sqrt (5). Это всегда кажется мне несколько замечательный, что это должно привести к целому числу, но это делает.
phi является золотым сечением, конечно; (1 + sqrt (5)) / 2.
Поскольку commons-cli не поддерживает это напрямую, самым простым решением, вероятно, является проверка значения опции, когда вы ее получите.
Я хотел такого поведения раньше, и никогда не встречал способа сделать это с помощью уже предоставленного метода. Это не значит, что его не существует. Неудачный способ - добавить код самостоятельно, например:
private void checkSuitableValue(CommandLine line) {
if(line.hasOption("a")) {
String value = line.getOptionValue("a");
if("foo".equals(value)) {
println("OK");
} else if("bar".equals(value)) {
println("OK");
} else {
println(value + "is not a valid value for -a");
System.exit(1);
}
}
}
Очевидно, что были бы более удобные способы сделать это, чем длинный if / else, возможно, с перечислением
, но это должно быть все вам понадобится. Также я не скомпилировал это, но я считаю, что это должно работать.
Этот пример также не делает переключатель «-a» обязательным, поскольку он не был указан в вопросе.
Другой способ - расширить класс Option. В процессе работы мы сделали следующее:
public static class ChoiceOption extends Option {
private final String[] choices;
public ChoiceOption(
final String opt,
final String longOpt,
final boolean hasArg,
final String description,
final String... choices) throws IllegalArgumentException {
super(opt, longOpt, hasArg, description + ' ' + Arrays.toString(choices));
this.choices = choices;
}
public String getChoiceValue() throws RuntimeException {
final String value = super.getValue();
if (value == null) {
return value;
}
if (ArrayUtils.contains(choices, value)) {
return value;
}
throw new RuntimeException( value " + describe(this) + " should be one of " + Arrays.toString(choices));
}
@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
} else if (o == null || getClass() != o.getClass()) {
return false;
}
return new EqualsBuilder().appendSuper(super.equals(o))
.append(choices, ((ChoiceOption) o).choices)
.isEquals();
}
@Override
public int hashCode() {
return new ashCodeBuilder().appendSuper(super.hashCode()).append(choices).toHashCode();
}
}