Страницы: 1 2 След.
RSS
VBA. Вычисление факториала типа n!/m!(n-m)!
 
Вычисление в пользовательской функции VBA простого факториала n! понятно
Код
Function Факториал(ByVal n As Long) As Double
n = n - 1
    If n = 0 Then
        Факториал = 1
        Exit Function
    End If
Факториал = Факториал(n) * (n + 1)
End Function
а вот если нужно найти скажем число сочетаний:
n!/m!(n-m)!

Самым простым способом было бы записать макрос, но к сожалению функция, как процедура, не работает.
Каким образом можно адаптировать функцию выше не понимаю?
Подскажите кто знает.
Спасибо.
Кто хочет — ищет способы, кто не хочет — причины (Сократ)
 
Так а вопрос в чем?
Код
Число_сочетаний=Факториал(n)/Факториал(m)/Факториал(n-m)
Соблюдение правил форума не освобождает от модераторского произвола
 
=Факториал(A2)/Факториал(A1)*Факториал(A2-A1)
 
Проще так :)
Код
Application.Combin(A1, A2)
Изменено: sokol92 - 18.08.2020 16:55:32
Владимир
 
Цитата
buchlotnik написал:
Число_сочетаний=Факториал(n)/Факториал(m)/Факториал(n-m)
Не понял? "Число_сочетаний" - название функции, "Факториал" - тоже название функции.
Разве они могут быть одинаковые?

В общем все вариации выдают ошибки, что мне кажется естественно.
Кто хочет — ищет способы, кто не хочет — причины (Сократ)
 
Цитата
Polkilo написал:
=Факториал(A2)/Факториал(A1)*Факториал(A2-A1)
Вообще не понятно. Вы наверно имели ввиду штатную функцию Excel:
= ФАКТР(C5)/ФАКТР(A5)*ФАКТР(C5-A5)
а я говорю о VBA.
Сразу оговорюсь что записанный макрос:
Код
ActiveCell.FormulaR1C1 = "= FACT(R[-19]C[-1])/FACT(R[-19]C[-3])*FACT(R[-19]C[-1]-R[-19]C[-3])"
тоже не проходит.
Кто хочет — ищет способы, кто не хочет — причины (Сократ)
 
Хм, факториал вычислять рекурсивно, хм,
Код
Function Factorial(N As Integer)
If N < 1 Then Exit Function
Factorial = 1
For i = 2 To N
    Factorial = Factorial * i
Next
End Function
По вопросам из тем форума, личку не читаю.
 
Цитата
KonstantinK написал:
"Число_сочетаний" - название функции
нет,переменной
Цитата
KonstantinK написал:
все вариации выдают ошибки
какие ваши доказательства?
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
БМВ написал:
Хм, факториал вычислять рекурсивно, хм,
Очень сильно я не хотел в циклы лезть. Но видимо не обойтись.
Примеров видел массу, но везде как у Вас - только один факториал n! Дальше сложнее.
Т.е. Вы имеете ввиду, что с начала получить через вложенные циклы три переменные:  n!, m! и (n-m)!
Ну и затем простая арифметика:
Число_сочетаний = k/p*h, где k = n!, p = m!  и  h = (n-m)!
Както так?
Кто хочет — ищет способы, кто не хочет — причины (Сократ)
 
Цитата
buchlotnik написал:
какие ваши доказательства?
Тогда я вообще не понял вы о чем?
Я о VBA? а вы?
Кто хочет — ищет способы, кто не хочет — причины (Сократ)
 
Цитата
KonstantinK написал:
а вы?
а я о файле примере, в котором
Цитата
KonstantinK написал:
все вариации выдают ошибки
и
Цитата
KonstantinK написал:
Я о VBA
я тоже:
Код
Function Число_сочетаний(x, y)
    Число_сочетаний = Факториал(x) / Факториал(y) / Факториал(x - y)
End Function

Function Факториал(x)
    If x < 1 Then Exit Function
    Факториал = 1
    For i = 2 To x
        Факториал = Факториал * i
    Next
End Function
так понятнее?
Изменено: buchlotnik - 18.08.2020 17:58:47
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
buchlotnik написал:
а я о
Тогда поясните мне глупому что такое в вашем коде:
Код
Число_сочетаний=Факториал(n)/Факториал(m)/Факториал(n-m)
"Число_сочетаний" и "Факториал"
В моем, а точнее справки VBA
Код
Факториал = Факториал(n) * (n + 1)
слово "факториал" - это название пользовательской функции, которое может быть любым, При этом обратите внимание что перед знаком равно и после него используется одно и тоже слово. А у вас, извините .....
Поймите правильно, я пытаюсь найти истину решить задачу, может я что-то не понимаю? Но вокруг вашего ответа я истины и решения не вижу.
Кто хочет — ищет способы, кто не хочет — причины (Сократ)
 
Цитата
KonstantinK написал:
А у вас, извините .....
а вот с этого места поподробнее, пожалуйста. KonstantinK, я вам уже развернутую версию в #11 привёл.
Цитата
KonstantinK написал:
вокруг вашего ответа я истины и решения не вижу
ну что ж, насильно, мил не будешь...
Цитата
buchlotnik написал:
а я о файле примере
Цитата
KonstantinK написал:
Тогда поясните мне глупому
ну, не я это сказал
Изменено: buchlotnik - 18.08.2020 18:14:25
Соблюдение правил форума не освобождает от модераторского произвола
 
KonstantinK, Любое действие можно декомпозировать и из минимального дискрета сделать функцию. В данном случае число сочетаний C из n по к считается с использованием факториалов простой арифметикой. buchlotnik, несколько раз вам показал как.
По вопросам из тем форума, личку не читаю.
 
Цитата
buchlotnik написал:
я вам уже развернутую версию в #11 привёл
этот код вы добавили позже, я его не видел. Спасибо, дело пошло.
Но в нем тоже не все так.
Если с аргументами x и y в функциях  понятно, то формула - как аргумент функции  ФакториалXY(x-y) - ?
То и  имя функции, которую мы вызываем, должно быть соответственно Function ФакториалXY(x-y) As Double
В коде ниже функция ФакториалXY(k) не рабочая, т.к. значения X и Y не определены или не связаны с основной функцией Число_сочетаний.
Опять стопор, полумеры?
Код
Function Число_сочетаний(ByVal x As Long, y As Long) As Double
Dim k As Double
k = x - y ' результата не дает
    Число_сочетаний = ФакториалX(x) / ФакториалY(y) / ФакториалXY(k) ' пишем ФакториалXY(k) потому что в "Function ФакториалXY(x-y)" аргумент функции не может быть формулой
End Function
Function ФакториалX(ByVal x As Long) As Double
Dim i As Long
    If x < 1 Then Exit Function
    ФакториалX = 1
    For i = 2 To x
        ФакториалX = ФакториалX * i
    Next
End Function
Function ФакториалY(ByVal y As Long) As Double
Dim i As Long
    If y < 1 Then Exit Function
    ФакториалY = 1
    For i = 2 To y
        ФакториалY = ФакториалY * i
    Next
End Function
Function ФакториалXY(k) As Double ' косяк с вычислением последнего аргумента??????
Dim i As Long
Dim x As Long, y As Long
k = x - y
    If k < 1 Then Exit Function
    ФакториалXY = 1
    For i = 2 To k
        ФакториалXY = ФакториалXY(k) * i ' если функцию записать как ФакториалXY(x-y) тоже нет смысла, т.к. значения X и Y не определены
    Next
End Function
Кто хочет — ищет способы, кто не хочет — причины (Сократ)
 
Цитата
KonstantinK написал:
Если с аргументами x и y в функциях  понятно, то формула - как аргумент функции  ФакториалXY(x-y) - ?То и  имя функции, которую мы вызываем, должно быть соответственно Function ФакториалXY(x-y) As DoubleВ коде ниже функция ФакториалXY(k) не рабочая, т.к. значения X и Y
Изменено: БМВ - 18.08.2020 20:22:50
По вопросам из тем форума, личку не читаю.
 
Offtop
Привет, Михаил.
Вы вот тут картинками шутите, а мне с такими ещё и работать приходиться. Бизнес-аналитики, они такие... :)
 
Андрей VG, Андрей, привет. Да все тоже самое , но вид с боку.  
По вопросам из тем форума, личку не читаю.
 
Цитата
KonstantinK написал:
этот код вы добавили позже
Цитата
buchlotnik написал:
Изменено: buchlotnik  - 18 авг 2020 17:58:47
Цитата
KonstantinK написал:
18 авг 2020 18:07:40
ну да ладно
Цитата
KonstantinK написал:
То и  имя функции, которую мы вызываем, должно быть соответственно Function ФакториалXY(x-y) As Double
кому оно что должно?
почему вы просто не используете код из #11? Это ВЕСЬ необходимый код, его не надо переписывать
Цитата
KonstantinK написал:
Но в нем тоже не все так.
КАКИЕ ВАШИ ДОКАЗАТЕЛЬСТВА?
Изменено: buchlotnik - 18.08.2020 20:40:32
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
buchlotnik написал:
КАКИЕ ВАШИ ДОКАЗАТЕЛЬСТВА?
ТЕЗКА НЕEEНААААДАААААА!!!!
По вопросам из тем форума, личку не читаю.
 
Цитата
Андрей VG написал:
а мне с такими
Какими такими? Вы вопрос читали? Куда #17 приложить, в какое место  кода VBA?

Точно, ответ написан семантическими чернилами, я просто не вижу.
18 сообщений в теме, а по делу только одно #11.
Меня модераторы давно бы присекли.
Цитата
Андрей VG написал:
ещё и работать приходиться
работать с таким результатом? Задан вопрос, ответ =0 - это ваш результат.
Цитата
БМВ написал:
Да все тоже самое , но вид с боку
А ваш ответ чем отличается? Я думал вы серьезный человек, результат тот же. Жаль.

Мои вопросы риторические. Здесь место для конкретики, а не для бла-бла.
К стати с оружием аккуратнее. У меня был один "умник", все знал все умел, а на деле полный ноль. Самоутвердится у него  так и не получилось. Ствол в рот, затылок и содержимое черепа на бетоне. 7,62 - хороший калибр.

Здоровья всем.
Ответа на задачу, думаю не получу. Только пустышки.
Кто хочет — ищет способы, кто не хочет — причины (Сократ)
 
Цитата
KonstantinK написал:
Я думал вы серьезный человек, результат тот же. Жаль.
А вы встречали серьезного обкуренного медведя?

Допустим Вам надо вычислить
вы будете отдельно писать функцию SQRT8minus4() ?  
Попробуйет то что вам уже предложено и сравните результат https://mnogoformul.ru/chislo-sochetaniy
Изменено: БМВ - 18.08.2020 21:06:13
По вопросам из тем форума, личку не читаю.
 
Цитата
KonstantinK написал:
а по делу только одно #11.
вам дали ответы в #2,#3 и #4; предложили более оптимальный вариант базовой функции в #7. Вы не удосужились даже попробовать предложенные варианты. Тогда пришлось написать #11, код из которого вы превратили в ахинею из #15.
Цитата
KonstantinK написал:
Ответа на задачу, думаю не получу.
чем не устроил код из #11? конкретно, чем?
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
buchlotnik написал:
Это ВЕСЬ необходимый код, его не надо переписывать
5 из 36 у вас = 376992
а у эксель
Код
=ФАКТР(C5)/ФАКТР(A5)*ФАКТР(C5-A5) = 2,5490342555202E+73 
( 73 это нолики)
Код
=ФАКТР(36)/ФАКТР(5)*ФАКТР(31)

я не вижу в вашей формуле участия аргумента "y" и факториала (x-y)!
Кто хочет — ищет способы, кто не хочет — причины (Сократ)
 
Цитата
KonstantinK написал:
ответ =0 - это ваш результат.
А зачем? Если есть #4. Если про изучать, то начните
1. С правильного именования Вычисление факториала типа n!/m!(n-m)!, а не выдумывания отсебятины.
2. С правильной расстановки математической записи выражения  n!/m!(n-m)!, так как фактически вы написали, выделю скобками  (n!/m!) * (n-m)!
 
Цитата
KonstantinK написал:
а у эксель =ФАКТР(C5)/ФАКТР(A5)*ФАКТР(C5-A5) = 2,5490342555202E+73
тот факт, что вы не знаете, как записывать простейшую арифметику в Excel не освобождает от ответственности:
Цитата
buchlotnik написал:
=Факториал(n)/Факториал(m)/Факториал(n-m)
или для особо тугих:
=Факториал(n)/(Факториал(m)*Факториал(n-m))

Пы.Сы.
а ещё в Excel есть =ЧИСЛКОМБ(C5;A5) которая также выдаст
Цитата
KonstantinK написал:
376992
Изменено: buchlotnik - 18.08.2020 21:24:02
Соблюдение правил форума не освобождает от модераторского произвола
 
KonstantinK,  при всей своей несерьезности я могу отличить разницу между a/(b*c) что эквивалентно a/b/c и a/b*c.  Правда эта ошибка у вас с Вашего первого поста. Обратите внимание на правила записи вычислений, порядок действий, применение скобок там .....

а также
Цитата
KonstantinK написал:
я не вижу в вашей формуле участия аргумента "y" и факториала (x-y)!
мой обкуренный взор улавливает закономерность, что 31=36-5

Вы точно нам нас не тролите?
Изменено: БМВ - 18.08.2020 21:37:19
По вопросам из тем форума, личку не читаю.
 
Цитата
KonstantinK написал:
я не вижу в вашей формуле участия аргумента "y" и факториала (x-y)!
вам бы повнимательнее почитать
Цитата
KonstantinK написал:
справки VBA
потому как код из #11 можно и так написать
Код
Function Число_сочетаний(x, y)
    Число_сочетаний = Факториал(x) / Факториал(y) / Факториал(x - y)
End Function

Function Факториал(зю)
    If зю < 1 Then Exit Function
    Факториал = 1
    For i = 2 To зю
        Факториал = Факториал * i
    Next
End Function
так вы и аргумента  x не увидите
Изменено: buchlotnik - 18.08.2020 21:33:17
Соблюдение правил форума не освобождает от модераторского произвола
 
вот это диспут!
вот это накал математической мысли! ))) как умножить разделить 3 числа.
уважаемый KonstantinK,  число сочетаний из 36 по 5 равно 376992 и ни одним сочетанием меньше или больше
нужно проявить характер и смириться с этим фактом
как это не прискорбно не понимаю чем тут еще вам помочь
давайте поспорим на 100 баксов чему равно количество сочетаний по 5 из 36, может это закончит обсуждение в данной теме
если в классе есть 36 учеников а нужно выставить на соревнования команду из 5 человек, то из этих 36 учеников можно собрать 376992 разных состава по 5 человек.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
вот это накал математической мысли!
не, накал это вот так:
Код
Function Число_сочетаний_накал(x, y)
    Число_сочетаний_накал = 1
    For i = 1 To y
        Число_сочетаний_накал = Число_сочетаний_накал * (x - i + 1) / i
    Next
End Function
только все равно 376992 выводит (иногда даже несколько быстрее) :D
Изменено: buchlotnik - 19.08.2020 00:45:26
Соблюдение правил форума не освобождает от модераторского произвола
Страницы: 1 2 След.
Наверх