@DeNySzZz
Человек, мечтающий стать мобильным разработчиком

Можете подсказать, как перевести программу в рекурсию?

Здравствуйте, я перепробовал многое, но так и не могу понять, как переделать такую программу на рекурсию?
Конечно, легче было бы написать просто for (i in 0 until 7), что-то в таком роде, но консольная программа должна быть универсальна для любых введенных значений, как это получилось сделать в 1-ой программе
Условие:
Написать рекурсивную функцию вычисления чисел Фибоначчи: 1,1,2,3,5,8,13,21,…
Используя ее, найти первые семь нечетных членов последовательности.
исходный код:
fun fibonacci(n: Int) {
    var fibonacci1 = 0
    var fibonacci2 = 1
    var fibonacci: Int
    if ( n == 1 ) print("1 ")
    if ( n > 1 )
    {
        var k = 0
        print( "1 ")
        while(k != n-1 )
        {
            fibonacci = fibonacci1 + fibonacci2
            if ( fibonacci % 2 != 0 ) {
                k++
                print ("$fibonacci ")
            }
            fibonacci1 = fibonacci2
            fibonacci2 = fibonacci
        }
    }
}
fun main()
{
    //Написать рекурсивную функцию вычисления чисел Фибоначчи: 1,1,2,3,5,8,13,21,… Используя ее, найти…
    //первые семь нечетных членов последовательности.
    print("Введите кол-во чисел Фибоначчи, которые хотите увидеть: ")
    val n = readLine()!!.toInt()
    fibonacci(n)
}


код, который имеется для рекурсии:
fun fibonacci(n: Int): Int {
        if(n == 0) return 0;
        if(n == 1 || n == 2) return 1;

        return fibonacci(n-1)+fibonacci(n-2);
}
fun output(n: Int) {
    var k = 0
    var value = n
    for (i in 0 until value)
    {
        while (k != n)
            if (fibonacci(i) % 2 != 0) {
                print("${fibonacci(i)} ")
                k++
            }
        value++
    }
}
fun main()
{
    //Написать рекурсивную функцию вычисления чисел Фибоначчи: 1,1,2,3,5,8,13,21,… Используя ее, найти…
    //первые семь нечетных членов последовательности.
    print("Введите кол-во чисел Фибоначчи, которые хотите увидеть: ")
    val n = readLine()!!.toInt()
    output(n)
}
  • Вопрос задан
  • 60 просмотров
Пригласить эксперта
Ответы на вопрос 2
zagayevskiy
@zagayevskiy Куратор тега Kotlin
Android developer at Yandex
Раз уж речь о котлине, то точно нужна версия с хвостовой рекурсией.
fun fib(n: Int) = recursiveFib(n, 1, 1)
private tailrec fun recursiveFib(n: Int, p1: Int, p2: Int): Int = when (n) {
   1 -> p1
   2 -> p2
   else -> recursiveFib (n - 1, p2, p1+p2)
}
Ответ написан
Комментировать
Вообще, вычисление чисел фибоначи через рекурсию гораздо легче, чем итеративно )
Определение числа фибоначи
F(1) = 1
F(2) = 1
F(x) = F(x - 1) + F(x - 2)

fun fib(n: Int): Int = when (n) {
    1,2 -> 1
    else -> fib(n-1) + fib(n-2)
}

(только тут нет обработки ошибок)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы