Связь чисел Фибоначчи и числа "сочетаний" - QBasic
Формулировка задачи:
Чтобы понять о чем идет речь я приведу частный пример.
дано 5 натуральных чисел 1, 2, 3, 4, 5. составим из этих
чисел следующие сочетания. Порядок строго соблюдается!!
1) 1, 2, 3, 4, 5
2) 12, 3, 4, 5
3) 1, 23, 4, 5
4) 1, 2, 34, 5
5) 1, 2, 3, 45
6) 1, 23, 45
7) 12, 3, 45
8) 12, 34, 5
Нужно составить программу, которая для произвольного
числа N могла бы сосчитать число приведенных выше в
качестве примера сочетаний.
Алгоритм
к моему удивлению алгоритм оказался прост, точно
такой же (рекурсия) каким вычисляются числа Фибоначчи.
то есть
количество сочетаний (n)= Фибоначчи(n+1)
Вопрос
Как обобщить программу, чтобы она вычисляла количество
любых сочетаний?
то есть в нашем примере должны добавиться и такие сочетания
9) 123, 45
10) 12345
11) и так далее. Сколько их?
Решение задачи: «Связь чисел Фибоначчи и числа "сочетаний"»
textual
Листинг программы
DIM a(1 TO 20) AS LONG, i AS LONG, j AS LONG, m AS LONG, k AS LONG, n AS LONG, p AS LONG, txt AS STRING n = 5 'количество чисел m = n - 1 'количество запятых FOR k = m TO 0 STEP -1 'перебираем запятые между числами, от n-1 зяпятых до 0 IF k = 0 THEN 'если запятых нет, то просто выводим ряд чисел txt = "" FOR i = 1 TO n txt = txt + LTRIM$(STR$(i)) NEXT i PRINT txt ELSE FOR i = 1 TO k: a(i) = i: NEXT i IF k = m THEN p = 1 ELSE p = k DO 'генерация всех сочетаний из m по k 'вывод чисел j = 0 txt = "" FOR i = 1 TO k WHILE j < a(i) j = j + 1 txt = txt + LTRIM$(STR$(j)) WEND txt = txt + "," NEXT i FOR i = j + 1 TO n txt = txt + LTRIM$(STR$(i)) NEXT i PRINT txt IF a(k) = m THEN p = p - 1 ELSE p = k IF p THEN FOR i = k TO p STEP -1 a(i) = a(p) + i - p + 1 NEXT i END IF LOOP WHILE p END IF NEXT k PRINT "Kol-vo:"; 2 ^ m
Объяснение кода листинга программы
Код представляет собой реализацию вычисления чисел Фибоначчи и их связи с числами сочетаний
. Вот список действий, которые происходят в коде:
- Задаются константы:
- n = 5 - количество чисел в ряду (общее количество чисел Фибоначчи, которые будут выведены).
- m = n - 1 - количество запятых между числами в ряду (количество чисел
сочетаний
, которые будут выведены).
- В цикле перебираются запятые между числами, от n-1 запятых до 0:
- Если запятых нет, то просто выводится ряд чисел.
- Если есть запятая, то генерируются все сочетания из m по k (количество чисел
сочетаний
, которые будут выведены).
- В подцикле генерируются все числа
сочетаний
от m до k:- Выводятся числа
сочетаний
. - Если a(k) = m, то p = p - 1 (поскольку последнее число
сочетаний
уже было выведено). - Если p не равно 0, то в цикле перебираются числа от k до p, при этом a(i) присваивается a(p) + i - p + 1 (поскольку числа Фибоначчи определяются как a(i) = a(i-1) + a(i-2)).
- Выводятся числа
- После завершения цикла выводится общее количество чисел
сочетаний
, которое равно 2 в степени m.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д