Так как это домашнее задание, я дам только маленькие подсказки.
Две проблемы не связаны, поэтому вам нужно два метода: toBinary и fib.toBinary (fib (n));
будет вашим решением.
Для решения задачи toBinary деление и модуль являются полезными и могут вызываться рекурсивно.
Если вы вычисляете fib (n) как fib (n-1) + fib (n-2), возникает ловушка, в которую вы можете перейти, когда вычисляете fib (n-1) как fib (n)-2) + fib (n-3), вы в итоге вычисляете fib (n-2) дважды, fib (n-3) три раза и так далее.
Вместо этого вы должны начать с (0 + 1) и идти вверх, пропуская уже рассчитанный вперед.
После короткого теста я вижу, как быстро растут числа Фибоначчи.У вас есть доступ к Ints произвольного размера, или вы собираетесь использовать предварительно выделенные массивы?
Тогда вам понадобится метод add, который принимает младшее и большее число в виде массива целых или логических значений и создает сумму в нижнем массиве, который затем становится верхним массивом.
обновление:
Поскольку вы решили проблему, я не стесняюсь опубликовать мое решение для справки, написанное на Scala:
import annotation._
/**
add two arrays recursively. carry the position pos and the overrun
overrun=0 = 1 0 1 0 1
Sum low | next | Sum
0 1 | overrun | %2
high 0| 0 1 1 2 | 0 0 0 1 | 0 1 1 0
1| 1 2 2 3 | 0 1 1 1 | 1 0 0 1
*/
@tailrec
def add (low: Array[Int], high: Array[Int], pos: Int = 0, overrun: Int = 0): Array[Int] = {
if (pos == higher.size) {
if (overrun == 0) low else sys.error ("overrun!")
} else {
val sum = low (pos) + high (pos) + overrun
low (pos) = (sum % 2)
add (low, high, pos + 1, if (sum > 1) 1 else 0)
}
}
/** call cnt (example: 5) steps of
fib (5, 0, 1),
fib (4, 1, 1),
fib (3, 1, 2),
fib (2, 2, 3),
fib (1, 3, 5),
fib (0, 5, 8) */
@tailrec
def fib (cnt: Int, low: Array[Int], high: Array[Int]): Array[Int] = {
if (cnt == 0) low else fib (cnt - 1, high, add (low, high)) }
/** generate 2 Arrays, size dependent on n of about 0.7*n + 1, big enough to
hold values and result. Result has to be printed in reverse order, from the highest bit
*/
def fibonacci (n: Int) = {
val lower = Array.fill (n * 7 / 10 + 1)(0) // [...000]
val higher = Array.fill (n * 7 / 10 + 1)(0) // [...000]
higher (0) = 1 // [...001]
val res = fib (n, lower, higher)
res.reverse.foreach (print)
println ()
res
}
fibonacci (n)
Для Фибоначчи (10000) Я получаю результат почти 7000 двоичных цифр, и отношение 10/7 является постоянным, поэтому миллионная цифра Фибоначчи будет иметь около 1,4 млн цифр.