Задача
Дана функция, аргументы которой – неотрицательные целые числа [latex]m[/latex] и [latex]n[/latex] [latex](m ≤ n)[/latex]:
-
[latex]f(m,n)=\begin{cases} 1, \text{ npu } m=0 \\\\ f(m-1,n-1)+f(m,n-1), \text{ npu } 0<m<n \\\\ 1, \text{ npu } m=n \end{cases}[/latex]
Составить алгоритм, вычисляющий значение функции.
Входные данные
Два целых неотрицательных числа [latex]n[/latex] и [latex]m[/latex] [latex](0 ≤ m, n ≤ 20)[/latex].
Выходные данные
Выведите искомое значение заданной функции [latex]f(m, n)[/latex].
Тесты
# | Входные данные | Выходные данные |
---|---|---|
1 | 4 2 | 6 |
2 | 7 7 | 1 |
3 | 12 0 | 1 |
4 | 15 5 | 3003 |
5 | 10 6 | 210 |
Код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <iostream> using namespace std; int f( int m, int n) { // функция с её аргументами if (m == 0 || m == n ) return 1; if (m < n) return f(m - 1, n - 1) + f(m, n - 1); } int main() { int n, m, d; cin >> n >> m; d = f(m, n); //вызов функции cout << d; return 0; } |
Решение задачи
Для того, чтобы решить задачу, нам необходимо составить алгоритм, который будет вычислять значение заданной функции в зависимости от значения её аргументов. Для этого создадим специальную функцию [latex]f[/latex].
Строки 4 — 6 кода составляют тело функции. Программа выбирает, какую операцию ей нужно выполнить, в зависимости от определенного условия:
- Если [latex]m = 0[/latex] или [latex]m = n[/latex], то программа возвращает единицу.
- Если [latex]m < n[/latex], то программа вычисляет значение функции по формуле [latex]f(m — 1,n — 1)+f(m,n — 1)[/latex]
Далее в главной функции main() мы вызываем нашу функцию [latex]f[/latex] с помощью новой переменной [latex]d[/latex] и выводим результат.
Ссылки
Ссылка на e-olymp
Ссылка на ideone
В теле функции можно два оператора if заменить на один, в котором в условии будет логическая операция. В решении задачи вы так и написали, но не раелизовали.
Спасибо, исправила
Путаете формулы $main$ и код main().