Форум программистов, компьютерный форум, киберфорум
QBasic
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
1

Связь чисел Фибоначчи и числа "сочетаний"

23.09.2016, 18:20. Показов 2473. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Чтобы понять о чем идет речь я приведу частный пример.
дано 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) и так далее. Сколько их?

QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
REM
REM  1 23 4 56 78 9 ... N
REM
REM  Fibonachi AND "Sochetania"
REM
 
DECLARE FUNCTION f! (n!)
 
CLS
FOR i = 1 TO 20
   PRINT f(i)
NEXT
END
 
FUNCTION f (n)
   IF n <= 3 THEN
      f = n
   ELSE
      f = f(n - 1) + f(n - 2)
   END IF
END FUNCTION
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.09.2016, 18:20
Ответы с готовыми решениями:

Вычисление чисел Фибоначчи и номера числа Фибоначчи с накопителями
Требуется три накопителя - текущий номер, само число Фибонначи и предыдущее число...

Набрать с чисел Фибоначчи в интервале от 1 до 100, только просто числа, а также их порядковые номера в ряду Фибоначчи
Помогите с задачкой... Набрать с чисел Фибоначчи в интервале от 1 до 100, только просто числа,...

Набрать с чисел Фибоначчи в интервале от 1 до 100, только просто числа, а также их порядковые номера в ряду Фибоначчи
Помогите с задачкой Набрать с чисел Фибоначчи в интервале от 1 до 100, только просто числа, а...

Определить номер N числа Фибоначчи, при котором сумма N первых чисел Фибоначчи превышает заданное число М
Определить номер N числа Фибоначчи, при котором сумма N первых чисел Фибоначчи превышает заданное...

8
6171 / 936 / 310
Регистрация: 25.02.2011
Сообщений: 1,367
Записей в блоге: 1
23.09.2016, 21:24 2
Лучший ответ Сообщение было отмечено echs как решение

Решение

Задача имеет математическое (комбинаторное) решение:
в первом случае нужно поставить 4 запятых между 5ти чисел, количество вариантов вычисляем через сочетания - С(4,4) = 4!/4!/0! = 1
Далее, нужно поставить 3 запятых между пяти чисел, при этом имеется 4 места, куда можно поставить запятую, количество вариантов - С(4,3) = 4!/3!/1! = 4
и так далее
общее количество вариантов: С(4,4) + С(4,3) + С(4,2) + С(4,1) + С(4,0) = 1+4+6+4+1 = 2^4 = 16
При этом не нужно вычислять сочетания, т.к. сумма всех сочетаний можно вычислить через степень двойки.

Сами сочетания можно вычислить через факториалы либо треугольником Паскаля (но никак не числами Фибоначчи).
Один из вариантов вычисления:
Visual Basic
1
2
3
4
5
6
7
8
9
10
Function MyCombin#(ByVal n As Long, ByVal m As Long)
    Dim i As Long
    If m > n Or m < 0 Then Exit Function
    If m > n - m Then m = n - m
    MyCombin = 1
    For i = 1 To m
        MyCombin = MyCombin * n / i
        n = n - 1
    Next i
End Function
Добавлено через 4 минуты
Проверка:
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
DIM i AS LONG, n AS LONG, m AS DOUBLE, s AS DOUBLE
n = 20
FOR i = 0 TO n
    m = MyCombin(n, i)
    PRINT i, m
    s = s + m
NEXT i
PRINT s, 2 ^ n
 
FUNCTION MyCombin#(BYVAL n AS LONG, BYVAL m AS LONG)
    DIM i AS LONG
    IF m > n OR m < 0 THEN EXIT FUNCTION
    IF m > n - m THEN m = n - m
    MyCombin = 1
    FOR i = 1 TO m
        MyCombin = MyCombin * n / i
        n = n - 1
    NEXT i
END FUNCTION
Добавлено через 42 минуты
еще вариант:
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
DIM i AS LONG, n AS LONG, m AS DOUBLE, s AS DOUBLE
n = 20
m = 1
PRINT m
s = m
FOR i = 1 TO n
    m = m * (n + 1 - i) / i
    PRINT m
    s = s + m
NEXT i
PRINT s, 2 ^ n
1
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
24.09.2016, 08:40  [ТС] 3
m-ch
Спасибо!
Я уже понял, что Вы можете решить любую задачу.
Но я и не предполагал, что здесь завязана комбинаторика.
А моя программа (я так и не понял) ошибочна?
0
6171 / 936 / 310
Регистрация: 25.02.2011
Сообщений: 1,367
Записей в блоге: 1
24.09.2016, 16:58 4
Лучший ответ Сообщение было отмечено echs как решение

Решение

Цитата Сообщение от echs Посмотреть сообщение
Но я и не предполагал, что здесь завязана комбинаторика.
Как раз, чтобы вычислять количество сочетаний, нужны знания в комбинаторике
Цитата Сообщение от echs Посмотреть сообщение
А моя программа (я так и не понял) ошибочна?
Ошибка в том, что числа Фибоначчи и количество сочетаний из n по k не связаны друг с другом
Уточнение: в треугольнике Паскаля
Сумма чисел восходящей диагонали, начинающейся с первого элемента (n-1)-й строки, есть n-е число Фибоначчи
Добавлено через 6 минут
В коде второго поста под n подразумевается количество запятых, а не количество чисел
1
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
24.09.2016, 17:04  [ТС] 5
m-ch
СПАСИБО !!!
0
6171 / 936 / 310
Регистрация: 25.02.2011
Сообщений: 1,367
Записей в блоге: 1
24.09.2016, 17:51 6
Лучший ответ Сообщение было отмечено echs как решение

Решение

Программа, которая выводит все варианты расстановок запятых между числами
можно изменить значение n:
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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
Добавлено через 12 минут
И еще один вариант, основан не на последовательном переборе сочетаний, а на бинарном разложении числа
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
DIM i AS LONG, j AS LONG, n AS LONG, m AS LONG, txt AS STRING
n = 5 'количество чисел
FOR i = 0 TO 2 ^ (n - 1) - 1
    m = i
    txt = ""
    FOR j = 1 TO n
        txt = txt + LTRIM$(STR$(j))
        IF m MOD 2 THEN txt = txt + ","
        m = m \ 2
    NEXT j
    PRINT txt
NEXT i
PRINT "Kol-vo:"; 2 ^ (n - 1)
1
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
24.09.2016, 18:47  [ТС] 7
m-ch
Вы не поверите. Ваша последняя программа привела
меня в дикое восхищение! Я просто потрясен!!
Спасибо!
0
6171 / 936 / 310
Регистрация: 25.02.2011
Сообщений: 1,367
Записей в блоге: 1
24.09.2016, 19:00 8
Цитата Сообщение от echs Посмотреть сообщение
Ваша последняя программа привела
меня в дикое восхищение!
Надеюсь это не про программу перевода десятичного числа в двоичную систему.
Т.к. ничего сложного и интересного в этом коде нет.

Сам принцип решения простой:
имеем 5 чисел, между ними можем поставить максимум 4 запятых, запятая стоит - 1, запятая не стоит - 0
Фактически имеем максимально возможное количество вариантов 2^4 = 16
перебираем все числа от 0 до 15, переводим их в двоичную систему и ставим или не ставим запятую в зависимости от последовательностей битов.
Реализовать данный алгоритм очень просто, значительно сложнее и интереснее реализовать последовательный перебор сочетаний: 0 из 4, 1 из 4, 2 из 4, 3 из 4, 4 из 4
1
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
24.09.2016, 19:34  [ТС] 9
m-ch
Вы понимаете, дело вовсе не в коде. Код действительно
прост. Дело в том, что мы (многие из нас) часто ищем
сложное (хотя и очевидное) решение и упускаем из виду
совсем простое. Как будто его и вовсе не существует.
Спасибо вам от меня и тех, кто заглянет в эту тему. Уверен,
они будут с благодарностью вспоминать ваши программы!
а я? - я только учусь на ваших программах...
0
24.09.2016, 19:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.09.2016, 19:34
Помогаю со студенческими работами здесь

Вычислить массив чисел из первых 16 элементов числа чисел Фибоначчи в виде квадратной матрицы
Вычислить массив чисел из первых 16 элементов числа чисел Фибоначчи в виде квадратной матрицы

В файле записана непустая последовательность целых чисел, являющихся числами Фибоначчи. Приписать еще n чисел Фибоначчи
Здравствуйте! Дана следующая задача: &quot;В файле записана непустая последовательность целых чисел,...

Представить натуральное число в виде суммы чисел Фибоначчи так, чтобы в сумме не было соседних чисел Фибоначчи
Рассмотрим последовательность натуральных чисел a(0),a(1),..., образованную по закону-...

В массиве чисел определить числа Фибоначчи
Подскажите пожалуста кто знает, что неправильно в этой программе, на Паскале она работала, а вот ли...

Найти числа Фибоначчи в заданной последовательности чисел
если дана строка чисел как определить числа ряда фибоначчи из этой строки

Проверка принадлежности числа к ряду чисел Фибоначчи
Помогите сделать так, что бы представленный код не выводил 'None' После ответа. Сама задача...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru