Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
42 / 15 / 1
Регистрация: 06.12.2019
Сообщений: 429
.NET 4.x

Как это сделать через рекурсию?

09.01.2020, 11:51. Показов 2474. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C#
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
40
41
42
43
44
using System;
 
class Program
{
    public int[,] a = new int[37, 50];
    public int n;
    public int k;
    public int rec(int i, int t)
    {
        if (i == 0)
        {
            if (t == k)
            {
                return 1;
            }
            else
            {
                return 0;
            }
        }
        if (t + i <= k)
        {
            if (a[i, t] == 0)
            {
                a[i, t] += rec(i - 1, t + 1);
                a[i, t] += rec(i + 1, t + 1);
            }
        }
        return a[i, t];
    }
    static int Main()
    {
        string str = Console.ReadLine().ToString();
        string[] result = str.Split(' ');
        string n = result[0];
        string k = result[1];
        Program lol = new Program();
        lol.n = int.Parse(n);
        lol.k = int.Parse(k);
        Console.Write(lol.rec(lol.n, 0));
        Console.ReadKey();
        return 0;
    }
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.01.2020, 11:51
Ответы с готовыми решениями:

Возможно ли заменить рекурсию и как это все оптимизировать
Делаю редактор текстур для своей программы. Короче, пейнт с прозрачностью. Для инструмента Fill юзаю такой код private void...

Как это задание сделать через рекурсию?
У меня есть задание посчитать биномальный коэфициент простым способом и через рекурсию. Простым способом я сделал, нужно теперь это...

Надо добавить поле приход через кассу и через расчетный счет, как это сделать 1с 8 3 ут?
надо добавить поле приход через кассу и через расчетный счет как это сделать в отчет расчеты с клиентами сам пытался добавить отчет...

32
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
09.01.2020, 11:52
kauakutsatsauts, оно итак работает через рекурсию, о чем я уже вам писал... Смотрите строки 25, 26.
0
Эксперт .NET
 Аватар для Usaga
14136 / 9356 / 1350
Регистрация: 21.01.2016
Сообщений: 35,167
09.01.2020, 11:56
kauakutsatsauts, есть нормальный пример тут.
2
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
09.01.2020, 11:58
Usaga, ссылка битая.
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
09.01.2020, 12:00
Usaga,
В этом примере стэковерфлоэксепшн будет, выход то не предусмотрен.
0
09.01.2020, 12:01

Не по теме:

Даценд, скорее OutOfMemoryException, когда браузер не сможет следующую вкладку открыть)

0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
09.01.2020, 12:02
Usaga, ссылка случаем не на закрытый раздел? Возможно она автоматически исправляется, если у пользователя нет прав. У меня она ведет на
Как это сделать через рекурсию?
0
Эксперт .NET
 Аватар для Usaga
14136 / 9356 / 1350
Регистрация: 21.01.2016
Сообщений: 35,167
09.01.2020, 12:04
QuakerRUS, нормально она всё ведёт. Просто перейдите по ссылке в той теме.
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
09.01.2020, 12:04
Цитата Сообщение от QuakerRUS Посмотреть сообщение
Рекурсивно ведет? )
1
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
09.01.2020, 12:06
Даценд, именно так)

Добавлено через 1 минуту
Usaga, у меня она ведет сюда. Могу бесконечно по ней переходить)
Как это сделать через рекурсию?
0
Эксперт .NET
 Аватар для Usaga
14136 / 9356 / 1350
Регистрация: 21.01.2016
Сообщений: 35,167
09.01.2020, 12:08
QuakerRUS, блин, шутку портите)
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
09.01.2020, 12:10
Usaga, прошу прощения, не сообразил-с.
0
42 / 15 / 1
Регистрация: 06.12.2019
Сообщений: 429
09.01.2020, 12:17  [ТС]
QuakerRUS, Как исправить ошибку
Failed test #3 of 7. Wrong answer

This is a sample test from the problem statement!

Test input:
2 50

Correct output:
4861946401452


Your code output:
43422380
Свернуть

Добавлено через 29 секунд
Условие
QuakerRUS,
Магазин - 3
На расстоянии n шагов от магазина стоит человек. Каждую секунду он выбирает, куда сделать шаг: к магазину или в противоположном направлении. Напишите программу, которая определит, сколькими способами он может попасть в магазин, пройдя ровно k шагов и оказавшись в магазине только после выполнения последнего шага.

На вход подаются через пробел два целых числа n – расстояние до магазина в шагах и k – требуемое количество шагов, которые должен сделать человек (1 ≤ n ≤ k ≤ 50).

На выход следует подать только одно число - количество способов попадания в магазин.

Sample Input 1:

22 32
Sample Output 1:

138446
Sample Input 2:

5 7
Sample Output 2:

5
Sample Input 3:

2 50
Sample Output 3:

4861946401452
0
09.01.2020, 12:25

Не по теме:

Цитата Сообщение от kauakutsatsauts Посмотреть сообщение
Условие
QuakerRUS,
Автора даже выбирает заказчика! QuakerRUS, и не вздумайте пройти мимо!

0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
09.01.2020, 14:37
Цитата Сообщение от kauakutsatsauts Посмотреть сообщение
Как исправить ошибку
Количество вариантов превышает диапазон int.
Надо поменять на long.
Но считать такое количество вариантов будет ОООООчень долго!
C#
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
40
41
42
43
44
45
    class Program
    {
        /// <summary>Определение количесво вариантов прохождения пути
        /// длинной N за К шагов</summary>
        /// <param name="k">Количество шагов</param>
        /// <param name="n">Длина пути</param>
        public static long CountPaths(int k, int n)
        {
            /// Если длина пути отрицательна, значит магазин уже пройден
            /// Если длина пути равна нулю, значит до магазина уже дошли 
            /// В обоих случаях вариантов сделать следующие шаги нет
            if (n <= 0)
                return 0;
 
            /// Если количество шагов меньше длины пути, то вариантов нет
            if (k < n)
                return 0;
 
            /// Количесвто шагов и длина пути должны быть
            /// оба чётны или нечётны
            ///
            if ((k + n) % 2 != 0)
                return 0;
 
            /// Если количество шагов равно длине пути, то вариант 1
            if (k == n)
                return 1;
 
            /// В остальных случаях количесво вариантов равно сумме вариантов
            /// при шаге назад и при шаге вперёд
            return
                CountPaths(k - 1, n + 1) // Шаг Назад
                + CountPaths(k - 1, n - 1); // Шаг вперёд
 
        }
 
        static void Main(string[] args)
        {
 
            string[] inputArr = Console.ReadLine().Split();
            int n = int.Parse(inputArr[0]);
            int k = int.Parse(inputArr[1]);
            Console.WriteLine(CountPaths(k, n));
 
            Console.ReadKey();
1
42 / 15 / 1
Регистрация: 06.12.2019
Сообщений: 429
09.01.2020, 15:45  [ТС]
Элд Хасп,
А задержка больше одной секунды не должна быть

Добавлено через 13 минут
Элд Хасп, Можно это как нибудь исправить что бы по быстрее работало ?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
09.01.2020, 15:52
Цитата Сообщение от kauakutsatsauts Посмотреть сообщение
Можно это как нибудь исправить что бы по быстрее работало ?
Надо убирать рекурсию.
Но для этого нужно подумать над математикой.

С ходу не скажу.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
09.01.2020, 16:34
Цитата Сообщение от kauakutsatsauts Посмотреть сообщение
А задержка больше одной секунды не должна быть
Доведённый до ума вариант из начала темы
C#
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
40
41
    class Program
    {
        public static long CountPaths(int n, int k)
        {
            long[,] a = new long[37, 51];
            return _count(n, 0);
 
            long _count(int i, int t)
            {
                if (i == 0)
                {
                    if (t == k)
                    {
                        return 1;
                    }
                    else
                    {
                        return 0;
                    }
                }
                if (t + i <= k)
                {
                    if (a[i, t] == 0)
                    {
                        a[i, t] += _count(i - 1, t + 1);
                        a[i, t] += _count(i + 1, t + 1);
                    }
                }
                return a[i, t];
            }
        }
 
        static void Main(string[] args)
        {
 
            string[] inputArr = Console.ReadLine().Split();
            int n = int.Parse(inputArr[0]);
            int k = int.Parse(inputArr[1]);
            Console.WriteLine(CountPaths(n, k));
 
            Console.ReadKey();
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
09.01.2020, 17:11
Цитата Сообщение от kauakutsatsauts Посмотреть сообщение
задержка больше одной секунды не должна быть
Вот исправленный вариант с комментами
C#
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
        /// <summary>Определение количесво вариантов прохождения пути
        /// длинной N за К шагов</summary>
        /// <param name="k">Количество шагов</param>
        /// <param name="n">Длина пути</param>
        public static long CountPaths(int n, int k)
        {
 
            /// Количество шагов и длина пути должны быть
            /// оба чётны или нечётны
            if ((k + n) % 2 != 0)
                return 0;
 
            /// Словарь рачитанных вариантов
            Dictionary<(int steps, int length), long> calc = new Dictionary<(int steps, int length), long>();
 
            return _сount(k, n);
            long _сount(int step, int length)
            {
                /// Если длина пути отрицательна, значит магазин уже пройден
                /// Если длина пути равна нулю, значит до магазина уже дошли 
                /// В обоих случаях вариантов сделать следующие шаги нет
                if (length <= 0)
                    return 0;
 
                /// Если количество шагов меньше длины пути, то вариантов нет
                if (step < length)
                    return 0;
 
                /// Если количество шагов равно длине пути, то вариант 1
                if (step == length)
                    return 1;
 
                /// Проверка расчитывался ли уже такой вариант
                /// Если не расчитывался, то его расчёт
                if (!calc.TryGetValue((step, length), out long count))
                {
                    /// Количесво вариантов равно сумме вариантов
                    /// при шаге назад и при шаге вперёд
                    count =
                        _сount(step - 1, length + 1) // Шаг Назад
                        + _сount(step - 1, length - 1); // Шаг вперёд
                    /// Запись варианта в словарь
                    calc[(step, length)] = count;
                }
                /// Если возврат значения
                return count;
            }
        }
 
        static void Main(string[] args)
        {
 
            string[] inputArr = Console.ReadLine().Split();
            int n = int.Parse(inputArr[0]);
            int k = int.Parse(inputArr[1]);
            Console.WriteLine(CountPaths(n, k));
0
42 / 15 / 1
Регистрация: 06.12.2019
Сообщений: 429
09.01.2020, 17:58  [ТС]
Элд Хасп,17 строка 31 и 7 строка в ошибках посмотри сам компилятор не сможет от компилировать данный код
C#
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApp32
{
    class Program
    {
        public static long CountPaths(int n, int k)
        {
 
            if ((k + n) % 2 != 0)
                return 0;
 
            Dictionary<(int steps, int length), long> calc = new Dictionary<(int steps, int length), long>();
 
            return _сount(k, n);
            long _сount(int step, int length)
            {
                if (length <= 0)
                    return 0;
 
                if (step < length)
                    return 0;
 
                if (step == length)
                    return 1;
 
                if (!calc.TryGetValue((step, length), out long count))
                {
                    count =
                        _сount(step - 1, length + 1) 
                        + _сount(step - 1, length - 1); 
                                                       
                    calc[(step, length)] = count;
                }
 
                return count;
            }
        }
 
        static void Main(string[] args)
        {
 
            string[] inputArr = Console.ReadLine().Split();
            int n = int.Parse(inputArr[0]);
            int k = int.Parse(inputArr[1]);
            Console.WriteLine(CountPaths(n, k));
        }
    }
}
Добавлено через 2 минуты
1) Ошибка - Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка CS8137 Невозможно определить класс или элемент, использующий кортежи, так как не удалось найти необходимый тип компилятора.
C#
1
Dictionary<(int steps, int length), long> calc = new Dictionary<(int steps, int length), long>();
2) Ошибка - Неопределенный тип System не определён и не импортирован
C#
1
2
3
4
5
6
7
8
if (!calc.TryGetValue((step, length), out long count))
                {
                    count =
                        _сount(step - 1, length + 1) 
                        + _сount(step - 1, length - 1); 
                                                       
                    calc[(step, length)] = count;
                }
Добавлено через 23 секунды
Элд Хасп, Сайт пишет
Compilation error
main.cs(18,24): error CS1525: Unexpected symbol `steps', expecting `.'
main.cs(21,19): error CS1525: Unexpected symbol `(', expecting `,', `;', or `='
main.cs(21,30): error CS1525: Unexpected symbol `int', expecting `,', `;', or `='
main.cs(39,39): error CS1026: Unexpected symbol `,', expecting `)'
main.cs(39,48): error CS1026: Unexpected symbol `,', expecting `)'
main.cs(39,58): warning CS0642: Possible mistaken empty statement
main.cs(39,64): error CS1026: Unexpected symbol `)', expecting `)'
main.cs(44,44): error CS1026: Unexpected symbol `+', expecting `)'
main.cs(45,46): error CS1026: Unexpected symbol `-', expecting `)'
main.cs(47,26): error CS1026: Unexpected symbol `,', expecting `)'
main.cs(50,18): error CS1519: Unexpected symbol `return' in class, struct, or interface member declaration
main.cs(50,25): error CS1519: Unexpected symbol `;' in class, struct, or interface member declaration
main.cs(52,4): error CS1026: Unexpected symbol `}', expecting `)'
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.01.2020, 17:58
Помогаю со студенческими работами здесь

Как это сделать через listbox?
заполнить listbox рандомными числами, и по нажатию на кнопку1 вывести сумму эл-тов кратных 3, по нажатию на кнопку2 вывести среднее...

Как это сделать через мнр

Сделать сумму двух чисел в двоичной системе через рекурсию и функции
Задано два положительных числа в двоичной системе счисления.Составить программу вычисления суммы этих чисел,используя функцию сложения...

Подскажите как подобрать функцию или через какую программу это можно сделать?
подскажите пожалуйста как подобрать функцию или через какую программу это можно сделать если даны около (n-го количества) (сколько...

Надо добавить нового администратора через локальную политику домена. Как это сделать?!
Здравствуйте ОТЦИ и все кто рубит в Windows 2003... Начну сразу же с главного. Надо добавить нового администратора(локального), что бы он...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru