Ряд Фибоначчи в Java использование рекурсии и циклов

⚡ Умное резюме

Ряд Фибоначчи в Java Генерирует последовательность, в которой каждый член равен сумме двух предыдущих членов. В этой статье рассматриваются циклы for, while, ввод данных пользователем, рекурсивные и мемоизированные программы. tracАнализирует рекурсию и сравнивает временную сложность каждого подхода.

  • Основное правило: Каждый член последовательности является суммой двух предыдущих членов, и последовательность начинается с 0 и 1.
  • 🔁 Итеративный шаблон: Две переменные хранят предыдущее и следующее значения, а временное суммирование сдвигает их вперед при каждом проходе.
  • 🌀 Рекурсивный шаблон: Метод вызывает себя дважды за каждый семестр, при этом 0, 1 и 2 выступают в качестве базовых случаев.
  • 🇧🇷 Разрыв в сложности: Циклы выполняются за время O(n), в то время как наивная рекурсия выполняется за время O(2ⁿ), что делает её непригодной для использования после примерно 40 членов.
  • ???? Исправление мемоизации: Кэширование вычисленных терминов в массиве восстанавливает линейное время, сохраняя при этомping рекурсивная структура.
  • ⚠️ Лимит переполнения: 47-й член выходит за пределы диапазона целых чисел, поэтому для более длинных последовательностей требуется тип long или BigInteger.
  • ⌨️ Пользовательский ввод: Класс Scanner считывает необходимое количество во время выполнения, не изменяя логику генерации.

Ряд Фибоначчи в Java

Что такое ряд Фибоначчи? Java?

A Серия Фибоначчи in Java Фибоначчи — это последовательность чисел, в которой следующее число является суммой двух предыдущих. Первые два числа последовательности Фибоначчи — это 0 и 1. Числа Фибоначчи широко используются в исследованиях вычислительной производительности алгоритма, определяющего наибольший общий делитель двух целых чисел.

The Fibonacci sequence: 0, 1, 1, 2, 3, 5, 8, 13, 21, ...

В виде формулы правило имеет вид F(n) = F(n-1) + F(n-2), где F(0) = 0 и F(1) = 1. В таблице ниже показано, как образуются первые восемь членов.

Позиция (сущ.) Расчет Значение
0 Базовый вариант 0
1 Базовый вариант 1
2 0 + 1 1
3 1 + 1 2
4 1 + 2 3
5 2 + 3 5
6 3 + 5 8
7 5 + 8 13

Программа рядов Фибоначчи в Java использование цикла For

Итеративная версия хранит в памяти одновременно только два значения, поэтому она работает за линейное время и с постоянным объемом памяти.

//Using  For Loop
public class FibonacciExample {
	public static void main(String[] args)
	{
		// Set it to the number of elements you want in the Fibonacci Series
		 int maxNumber = 10;
		 int previousNumber = 0;
		 int nextNumber = 1;
	        System.out.print("Fibonacci Series of "+maxNumber+" numbers:");
	        for (int i = 1; i <= maxNumber; ++i)
	        {
	            System.out.print(previousNumber+" ");
	            /* On each iteration, we are assigning second number
	             * to the first number and assigning the sum of last two
	             * numbers to the second number
	             */


	            int sum = previousNumber + nextNumber;
	            previousNumber = nextNumber;
	            nextNumber = sum;
	        }
	}
}

Выход:

Fibonacci Series of 10 numbers:0 1 1 2 3 5 8 13 21 34

Логика программы:

  • Значение previousNumber инициализируется нулем, а значение nextNumber — единицей.
  • Цикл for по Фибоначчи выполняет итерации по... maxNumber:
    • Отобразить предыдущее число.
    • Вычислите сумму previousNumber и nextNumber.
    • Обновите значения полей previousNumber и nextNumber.

Программа рядов Фибоначчи в Java использование цикла while

Вы также можете создать Java Последовательность Фибоначчи с использованием while зациклиться JavaАрифметические операции идентичны, меняется только синтаксис цикла.

//Using  While Loop
public class FibonacciWhileExample {
	public static void main(String[] args)
	{
		 int maxNumber = 10, previousNumber = 0, nextNumber = 1;
	        System.out.print("Fibonacci Series of "+maxNumber+" numbers:");

	        int i=1;
	        while(i <= maxNumber)
	        {
	            System.out.print(previousNumber+" ");
	            int sum = previousNumber + nextNumber;
	            previousNumber = nextNumber;
	            nextNumber = sum;
	            i++;
	        }

	}

}

Выход:

Fibonacci Series of 10 numbers:0 1 1 2 3 5 8 13 21 34

Единственное отличие в логике программы заключается в использовании цикла while для вывода чисел Фибоначчи. Счетчик должен быть объявлен до цикла и увеличиваться внутри него, иначе цикл никогда не завершится.

Ряд Фибоначчи на основе пользовательского ввода

Задание количества терминов вручную удобно для демонстрации, но в реальных упражнениях значение обычно считывается с клавиатуры. Класс Scanner обрабатывает это в три строки, а логика генерации остается неизменной.

//fibonacci series based on the user input
import java.util.Scanner;

public class FibonacciUserInput {

    public static void main(String[] args)
    {
        int maxNumber = 0;
        int previousNumber = 0;
        int nextNumber = 1;

        System.out.println("How many numbers you want in Fibonacci:");
        Scanner scanner = new Scanner(System.in);
        maxNumber = scanner.nextInt();
        System.out.print("Fibonacci Series of " + maxNumber + " numbers:");

        for (int i = 1; i <= maxNumber; ++i)
        {
            System.out.print(previousNumber + " ");
            /* On each iteration, we are assigning the second number
             * to the first number and assigning the sum of the last two
             * numbers to the second number
             */

            int sum = previousNumber + nextNumber;
            previousNumber = nextNumber;
            nextNumber = sum;
        }

        scanner.close();
    }
}

Пример запуска:

How many numbers you want in Fibonacci:
7
Fibonacci Series of 7 numbers:0 1 1 2 3 5 8

Логика программы:
Логика та же, что и раньше. Вместо того чтобы жестко задавать количество элементов для отображения, вместо этого используется кодирование количества элементов в коде. Java Для вычисления числа из последовательности Фибоначчи пользователю предлагается ввести это число.

Ряд Фибоначчи с использованием рекурсии в Java

Ниже представлена ​​программа рядов Фибоначчи в Java используя рекурсию:

//Using Recursion
public class FibonacciCalc{
	public static int fibonacciRecursion(int n){
	if(n == 0){
		return 0;
	}
	if(n == 1 || n == 2){
			return 1;
		}
	return fibonacciRecursion(n-2) + fibonacciRecursion(n-1);
	}
    public static void main(String args[]) {
	int maxNumber = 10;
	System.out.print("Fibonacci Series of "+maxNumber+" numbers: ");
	for(int i = 0; i < maxNumber; i++){
			System.out.print(fibonacciRecursion(i) +" ");
		}
	}
}

Выход:

Fibonacci Series of 10 numbers: 0 1 1 2 3 5 8 13 21 34

Логика программы:

Рекурсивная функция — это функция, которая имеет возможность вызывать саму себя.

фибоначчиРекурсия():

  1. Java Функция рекурсии Фибоначчи принимает на вход число. Она проверяет значения 0, 1 и 2 и возвращает 0, 1, 1 соответственно, поскольку последовательность Фибоначчи в Java начинается с 0, 1, 1.
  2. Когда входное значение n равно 3 или больше, функция вызывает саму себя рекурсивно. Вызов происходит дважды. tracНиже приведен запрос на ввод значения 4.
fibonacciRecursion(4)
    = fibonacciRecursion(2) + fibonacciRecursion(3)

    fibonacciRecursion(2) = 1                    // base case, no further calls
    fibonacciRecursion(3) = fibonacciRecursion(1) + fibonacciRecursion(2)
                          = 1 + 1
                          = 2

    Result: 1 + 2 = 3

Базовые случаи останавливают спуск. Поскольку 1 и 2 возвращаются немедленно, ветвь для fibonacciRecursion(2) никогда не расширяется дальше, что и поддерживает tracконечное.

Оптимизированная последовательность Фибоначчи с использованием мемоизации

Обычная рекурсия многократно пересчитывает одни и те же члены. Для вычисления члена 40 требуется более 200 миллионов вызовов. Сохранение каждого результата при первом вычислении полностью исключает это дублирование.

public class FibonacciMemo {

    static long[] cache;

    public static long fib(int n) {
        if (n <= 1) {
            return n;
        }
        // return the stored value when it exists
        if (cache[n] != 0) {
            return cache[n];
        }
        cache[n] = fib(n - 1) + fib(n - 2);
        return cache[n];
    }

    public static void main(String[] args) {
        int maxNumber = 90;
        cache = new long[maxNumber + 1];

        System.out.println("Term 50 is: " + fib(50));
        System.out.println("Term 90 is: " + fib(90));
    }
}

Выход:

Term 50 is: 12586269025
Term 90 is: 2880067194370816120

⚠️ Предупреждение: 47-й член последовательности Фибоначчи равен 2971215073, что превышает максимальное значение целого числа 2147483647 и приводит к отрицательному переключению. Объявите переменные типа long, как только счетчик превысит 46, и переключитесь на тип BigInteger после 92-го члена.

Сравнение методов Фибоначчи в Java

Все четыре программы выводят одну и ту же последовательность, поэтому решение зависит от того, сколько членов необходимо.

Способ доставки Сложность времени Космическая сложность Практический предел
Для цикла О (п) O (1) Любое количество, в зависимости от числового типа.
Пока цикл О (п) O (1) Любое количество, в зависимости от числового типа.
Простая рекурсия О (2ⁿ) стек O(n) Примерно 40 терминов, прежде чем начнет замедляться.
Рекурсия с мемоизацией О (п) О (п) Любое количество, в зависимости от числового типа.

Та же схема счётчика и накопителя встречается в нескольких связанных упражнениях. Продолжайте с... Java программа палиндромов, Java программа для проверки простого числа, и Программа для вывода простых чисел от 1 до 100.Для практических занятий с использованием массивов см. Bubble Сортировать в Java и Java массивы, и просмотрите для каждого цикла в Java для альтернативного синтаксиса цикла.

Часто задаваемые вопросы (FAQ)

Существуют оба варианта. В информатике обычно используются 0 и 1 в качестве первых двух слагаемых, что и делают эти программы. В некоторых математических текстах вместо этого используются 1 и 1.

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

Тип данных int содержит значения до 46, а тип long — до 92. Для значений, превышающих 64 бита, требуется тип BigInteger.

Последовательные члены приближаются к золотому сечению, приблизительно равному 1.618. Этот паттерн встречается в расположении листьев, спиралях раковин, гибких шкалах оценки и техническом анализе в торговле.

Они часто возвращают простую рекурсию, поскольку это наиболее распространенный пример из учебников. Если количество терминов велико, явно запросите итеративное или мемоизированное решение.

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

Подведем итог этой публикации следующим образом: