Форум программистов, компьютерный форум, киберфорум
Pascal ABC
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
11 / 11 / 2
Регистрация: 17.02.2014
Сообщений: 947
1

Программирование рекурсивных процедур для вычисления выражения

09.02.2016, 16:08. Показов 1781. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вычислить значение:


https://www.cyberforum.ru/cgi-bin/latex.cgi?{c}_{n}^{m}=\frac{n!}{m!(n-m)!}


Здесь как я понял нужна процедура с параметрами n и m. Но не знаю как саму рекурсию организовать. Помогите пожалуйста.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2016, 16:08
Ответы с готовыми решениями:

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

Составить программу для вычисления выражения z=y³+y²/2*y½ с помощью подпрограмм и процедур
Составить программу для вычисления выражения z=y³+y²/2*y½ с помощью подпрограмм и процедур

Написать код четырёх процедур вычисления выражения
Здравствуйте, специалисты! Вопрос: что такое код четырёх процедур и как его написать? (В яндексе...

Разработка рекурсивных алгоритмов для вычисления функции
Сразу к сути!!! Я должен сделать рекурсию функции y=x+3-e^-x. Что то y2 не выводит, ошибок нету! ...

11
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
09.02.2016, 16:27 2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
function C(n,m:integer):real;
begin
if (m=0)or(m=n) then C:=1
else C:=C(n-1,m-1)+C(n-1,m);
end;
var m,n:integer;
begin
repeat
writeln('Ведите n m,  n>=m ');
readln(n,m);
until n>=m;
write('Число сочетаний=',C(n,m):0:0);
end.
Большие числа не водите, зависнет.
0
11 / 11 / 2
Регистрация: 17.02.2014
Сообщений: 947
10.02.2016, 06:15  [ТС] 3
Цитата Сообщение от Puporev Посмотреть сообщение
C:=C(n-1,m-1)+C(n-1,m);
А как здесь всё вычисляется, что то не пойму? Хотя всё правильно работает. Тут же только из арифметических действий сложение, а например такое выражение не понятно как вычисляется в программе C(n-1,m-1)
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
10.02.2016, 06:51 4
Здесь для написания рекурсивной функции определения числа сочетаний умные люди ( не я) не используют факториалы, а формулу
Cnk = Cn - 1k - 1 + Cn - 1k (при 0 < k < n).
При этом пишут
Действительно, выбрать из n предметов k можно Cnk способами. Пометим один из данных n предметов. Тогда все выборки можно разбить на две группы: в которые входит помеченный предмет (их будет Cn - 1k - 1) и не содержащие помеченного предмета (таких выборок будет Cn - 1k)).

Добавив к этой формуле краевые значения: Cnn = Cn0 = 1 (выбрать все предметы или не выбрать ни одного предмета можно единственным способом), можно написать рекурсивную функцию вычисления числа сочетаний:
Можно конечно и написать рекурсивную функцию факториала и считать по приведенной формуле, но эта функция лучше (более эффективна).
Хотя еще лучше считать число сочетаний и без рекурсии и без факториалов.
0
11 / 11 / 2
Регистрация: 17.02.2014
Сообщений: 947
10.02.2016, 06:54  [ТС] 5
То есть в данном случае мы сначала проходим вниз до того момента, когда начинает выполняться это условие: if (m=0)or(m=n) then C:=1. И потом поднимаемся вверх считая все значения на основании предыдущих. Правильно я понимаю?
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
10.02.2016, 06:54 6
Да.
0
11 / 11 / 2
Регистрация: 17.02.2014
Сообщений: 947
10.02.2016, 07:02  [ТС] 7
Цитата Сообщение от Puporev Посмотреть сообщение
Можно конечно и написать рекурсивную функцию факториала
В этом случае будет такое условие?
Pascal
1
if (n=1) and (m=1) or (n=0) and (m=0) or (n=1) and (m=0) and (n=0) or (m=1) then C:=1
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
10.02.2016, 07:15 8
Зачем? Пишется рекурсивная функция факториала
Pascal
1
2
3
4
5
function Fac(n:integer):longint;
begin
if n<2 then Fac:=1
else fac:=n*fac(n-1);
end;
и вычисляется выражение
Pascal
1
c:=Fac(n)/Fac(m)/Fac(n-m);
0
11 / 11 / 2
Регистрация: 17.02.2014
Сообщений: 947
10.02.2016, 07:21  [ТС] 9
Цитата Сообщение от Puporev Посмотреть сообщение
Зачем? Пишется рекурсивная функция факториала
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function Factrl (n: integer): integer; 
begin
 if n = 0 then
 Factrl:= 1;
 if n = 1 then
 Factrl:= 1;
 if n > 1 then
 Factrl:= n*Factrl(n-1);
end; 
var
C,n,m:integer;
begin
repeat
writeln('Ведите n m,  n>=m ');
readln(n,m);
until n>=m;
C:=(Factrl(n))/(Factrl(m)*Factrl(n-m));
write('Число сочетаний= ',C);
end.
Почему в этой строчке у меня ошибка?
Pascal
1
C:=(Factrl(n))/(Factrl(m)*Factrl(n-m));
Нельзя преобразовать real к integer пишет. Можно конечно написать везде real и будет работать. Но всё же почему такая ошибка?
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
10.02.2016, 07:34 10
Pascal
1
2
3
var C:real;
.....................
write('Число сочетаний= ',C:0:0);
и что за ерунда?
Pascal
1
2
3
4
if n = 0 then
 Factrl:= 1;
 if n = 1 then
 Factrl:= 1;
0
11 / 11 / 2
Регистрация: 17.02.2014
Сообщений: 947
10.02.2016, 08:39  [ТС] 11
Цитата Сообщение от Puporev Посмотреть сообщение
и что за ерунда?
Условия при которых факториал равен 1.

Добавлено через 4 минуты
Цитата Сообщение от Puporev Посмотреть сообщение
var C:real;
.....................
write('Число сочетаний= ',C:0:0);
Даже если так пишу:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function Fac(n:integer):longint;
begin
if n<2 then Fac:=1
else fac:=n*fac(n-1);
end;
var
C,n,m:integer;
begin
repeat
writeln('Ведите n m,  n>=m ');
readln(n,m);
until n>=m;
C:=fac(n)/fac(m)*fac(n-m);
write('Число сочетаний= ',C:0:0);
end.
Коприлятор выдаёт ошибку к той же строчке: "Нельзя преобразовать real к integer". Что же тут является типом real?
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
10.02.2016, 08:59 12
Совсем плохой что ли? Я же написал
Pascal
1
var C:real;
ты один хрен
Pascal
1
2
var
C,n,m:integer;
1
10.02.2016, 08:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.02.2016, 08:59
Помогаю со студенческими работами здесь

Составить программу для вычисления выражения y=sin²(a)/sin(b²)+sin(c+d) с помощью подпрограмм и процедур
Составить программу для вычисления выражения y=sin²(a)/sin(b²)+sin(c+d) с помощью подпрограмм...

Оформите программу для реализации в одной программе рекурсивных методов вычисления факториала
Оформите программу для реализации в одной программе рекурсивных методов вычисления факториала числа...

Выполнить задание с использованием рекурсивных процедур или функций
Мачеха приказала Золушке перебрать мешок зерна (40 кг). Началв в 6 часов вечера, Золушка каждый час...

Выполнить задание с использованием рекурсивных процедур или функций
1. Татьяна Ларина, читая очередной французский роман, подсчитала сумму номеров прочитанных страниц...


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

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