Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
1 / 1 / 0
Регистрация: 17.12.2013
Сообщений: 230
1

Пожалуйста, приведите примеры рекурсивных подпрограмм (желательно с комментариями)

31.01.2014, 22:01. Показов 1740. Ответов 17
Метки нет (Все метки)

Пожалуйста, приведите примеры рекурсивных подпрограмм (желательно с комментариями)
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.01.2014, 22:01
Ответы с готовыми решениями:

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

Приведите примеры кода с комментариями (asm или debug)
1. Вывести на экран текст 2. Рассчитать сумму всех элементов массива 3. Найти минимальный элемент...

Нужны примеры использования объекта effect (желательно с комментариями)
Делаю 2д игру. Захотелось реализовать различные операции с 2д изображениями для эффектов. Не мог бы...

Работа с конструкторами и деструкторами в с++. Приведите пожалуйста какие-то примеры
Помогите пожалуйста ! Нужна программа , которая демонстрирует работу конструкторов и деструкторов в...

17
Эксперт Java
3330 / 2768 / 850
Регистрация: 05.07.2013
Сообщений: 13,270
01.02.2014, 02:12 2
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Program
    {
        static void Main(string[] args)
        {
            Console.Write(fib(2));
            Console.Read();
        }
 
 
   public static int fib(int n)
   { 
//считает n-ное число Фибоначчи  0,1,1,2,3,5,8... каждое число равно сумме двух предыдущих
       return n<=1 ? n : fib(n-1) + fib(n-2);
   }
 
    }
0
28 / 28 / 11
Регистрация: 10.03.2012
Сообщений: 86
Записей в блоге: 5
01.02.2014, 11:20 3
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
 
namespace ConsoleApplication1
{ /* Задание 6
   * Возведение в степень
   */
 
    class Program
    {
        /// <summary>
        /// Функция возведения в степень 
        /// </summary>
        /// <param name="x">Число которое следует возвести</param>
        /// <param name="y">Степень</param>
        /// <returns></returns>
        static double st(int x, int y) // функция пренимает параметры int, а отравляет double
        {
           if (y > 0) return x * st(x, y - 1); 
           if (y == 0) return 1.0;   
           return 1.0/st(x, -y);
        }
        /// <summary>
        /// Точка входа в программу
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            Console.Write("Число ");
            int a=Convert.ToInt32(Console.ReadLine()); //инициализирем переменную и читаем данные
            Console.Write("Степень ");
            int b = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine(st(a,b)); // Вызываем ф-цию.
            
            Console.ReadLine(); // Для задерджки
        }
 
    }
}
Добавлено через 5 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
 
namespace ConsoleApplication10
{
  class Program
  {
    static void Main(string[] args)
    {
      Console.WriteLine(Fact(5));
    }
 
    static int Fact(int n)
    {
      if (n == 0)
        return 1;
      else
        return n*Fact(n-1);
    }
  }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Рекурсия
{
    class Program
    {
        static int n = 4;
        static double sqrn( int i) { return (i < n) ? (Math.Pow(i + sqrn(i + 1), i)) : 0; }
        static void Main(string[] args)
        {
            Console.Write(n/sqrn(1));
            Console.ReadKey();
        }
    }
0
Master of Orion
Эксперт .NET
6088 / 4944 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
01.02.2014, 12:02 4
xoraxax, никогда не делайте фибоначчи через рекурсию. Лучше уж факториал показывать.

Добавлено через 50 секунд
zabr91, Math.Pow в рекурсии тоже бесполезная штука. Остальное годно)
1
Эксперт Java
3330 / 2768 / 850
Регистрация: 05.07.2013
Сообщений: 13,270
01.02.2014, 19:16 5
Psilon, я вообще не припомню, что когда-либо использовал рекурсию.
Однако, что мешает считать рекурсией фибоначчи? В качестве примера, при том вполне наглядного, в самый раз, на мой взгляд.
0
Master of Orion
Эксперт .NET
6088 / 4944 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
01.02.2014, 19:22 6
xoraxax, как вы думаете, сколько раз будет вызвана функция при n = 30, к примеру?
0
dracon4ik
01.02.2014, 19:51
  #7

Не по теме:

xoraxax, многие задачи решаются через рекурсию. Не всегда ее можно заменить циклом

0
Master of Orion
Эксперт .NET
6088 / 4944 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
01.02.2014, 20:12 8
dracon4ik, Тезис Тьюринга-Черча как бы намекает, что это не совсем так...
0
53 / 70 / 20
Регистрация: 26.06.2013
Сообщений: 194
01.02.2014, 20:30 9
Psilon, ну по идее да, но если будет требоваться сделать что-то наподобие такого:
C#
1
2
3
4
5
6
7
8
9
10
11
12
static int a(int p)
        {
            if (p == 1) return 6;
            else if (p % 2 == 0) return p/2 + a(p / 3);
            else if (p % 7 == 0) return Convert.ToInt32(Math.Pow(p, 5)) / a(a(p % 4)*a(p * 4));
            else if (p * 5 % 3 == 0) return p * a(a(p - 4));
            else return a(p - 1) + p;
        }
        static void Main(string[] args)
        {
           int b= a(40);
        }
то вы пока сделаете это без рекурсии - замучаетесь. Я именно про такие случаи имел в виду - может тут и можно заменить, но как мне кажется очень сложно. P.S. алгоритм написан от балды

Добавлено через 2 минуты
Хотя нет, ошибся - тут заменить просто и даже нужно.
0
Master of Orion
Эксперт .NET
6088 / 4944 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
01.02.2014, 21:24 10
dracon4ik, да тут и заменять ничего не надо. Рекурсия нужна для замены циклов, а тут ни 1 цикла, одни условия. В функц. языках эта тема очень неплохо раскрыта. Компиляторы кстати там автоматически хвостовую рекурсию подбирают в циклы, настолько это стандартная и эквивалентная процедура)

Добавлено через 4 минуты
Вот пример:
http://pro-prof.com/archives/848

правда шарп в хвостовые рекурсии не умеет, афайк.
1
53 / 70 / 20
Регистрация: 26.06.2013
Сообщений: 194
01.02.2014, 21:58 11
По теме: быстрая сортировка
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
 static void quickSort(int[] a, int l, int r)
        {
            int temp;
            int x = a[l + (r - l) / 2];
            //запись эквивалентна (l+r)/2, 
            //но не вызывает переполнения на больших данных
            int i = l;
            int j = r; 
            while (i <= j)
            {
                while (a[i] < x) i++;
                while (a[j] > x) j--;
                if (i <= j)
                {
                    temp = a[i];
                    a[i] = a[j];
                    a[j] = temp;
                    i++;
                    j--;
                }
            }
            if (i < r)
                quickSort(a, i, r);
 
            if (l < j)
                quickSort(a, l, j);
        }
тут можно почитать о быстрой сортировке
0
Эксперт Java
3330 / 2768 / 850
Регистрация: 05.07.2013
Сообщений: 13,270
01.02.2014, 22:11 12
Psilon, человек хочет разобраться, как работает рекурсия. И я настаиваю на том. что числа Фибоначчи отлично иллюстрируют процесс. А вот как реализовать тот или иной алгоритм наиболее эффективно, это уже совершенно другой вопрос.
0
Master of Orion
Эксперт .NET
6088 / 4944 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
01.02.2014, 22:45 13
xoraxax, а я вот не согласен. Если все так очевидно, то посчитать число слагаемых при данном способе алгоритмизации же тоже просто? Потому что если нет, то и алгоритм далеко не так очевиден, как может показаться из того, что он занимает всего 1 строчку.
1
208 / 173 / 48
Регистрация: 20.09.2012
Сообщений: 479
01.02.2014, 23:22 14
Рекурсия. В данном случае метод вызывает сам себя, чтобы проверить все вложенные папки в папке. Если не понятно - пишите)
Обратите внимание, мы вызываем метод ShowDirs в нём же. Это и есть рекурсия.
C#
1
2
3
4
5
6
7
8
static void ShowDirs(DirectoryInfo dir)// Допустим dir == D:\
        {
            foreach (var path in dir.GetDirectories())// Для каждой папки в D:\ 
            {
                Console.WriteLine(path);// Вывести название папки на экран. Допустим это папка D:\Program Files
                ShowDirs(path);// Для каждой папки в D:\Program Files...  и так по кругу пока не закончатся папки=)
            }
        }
1
Master of Orion
Эксперт .NET
6088 / 4944 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
01.02.2014, 23:24 15
Самый хороший пример рекурсии это как раз обработка деревьев, одним из которых является файловая система для пользователя. Хороший годный пример
0
Эксперт Java
3330 / 2768 / 850
Регистрация: 05.07.2013
Сообщений: 13,270
01.02.2014, 23:31 16
Psilon, добавьте writeline в метод и все станет существенно нагляднее.
Вы бы сами хороший пример привели, для разнообразия.
0
208 / 173 / 48
Регистрация: 20.09.2012
Сообщений: 479
01.02.2014, 23:44 17
Более простой пример рекурсии. Добавляем 1 к заданному числу.
C#
1
2
3
4
5
6
static void PlusOne(int i)// Допустим i == 0;
        {
            i++; // Увеличиваем i на 1
            Console.WriteLine(i.ToString());// Выводим значение i. Поскольку 0+1=1, i=1;
            PlusOne(i);// Вновь вызываем метод, но в нашем случае i уже равно 1, а значит в конце цикла, оно будет 2, потом 3,4,5,6...... 
        }
Если без рекурсии то это можно сделать так:
C#
1
2
3
4
for ( int i = 0;;i++)
{
   Console.WriteLine(i.ToString());
}
0
Master of Orion
Эксперт .NET
6088 / 4944 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
02.02.2014, 00:23 18
Цитата Сообщение от xoraxax Посмотреть сообщение
Psilon, добавьте writeline в метод и все станет существенно нагляднее.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    class Program
    {
        private static int i = 0;
        static void Main(string[] args)
        {
            fib(30);
            Console.ReadKey();
        }
 
        public static int fib(int n)
        {
            Console.WriteLine("Вызов #{0}", i++);
            //считает n-ное число Фибоначчи  0,1,1,2,3,5,8... каждое число равно сумме двух предыдущих
            return n <= 1 ? n : fib(n - 1) + fib(n - 2);
        }
    }
более чем наглядно - результата я так и не дождался

Вы бы сами хороший пример привели, для разнообразия.
Уже привели хороший с перечислением директорий, обработка деревьев рекурсивно - крайне полезная и часто встречаемая задача, в отличие от искусственных задач на рекурсивный факториал и прочую лабуду, Хотя бы потому, что глубина рекурсии есть высота дерева, а это логарифм от числа элементов.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.02.2014, 00:23

Какое имя давать БД musql? Приведите примеры какие имена вы даете пожалуйста ))
Сайт на Вордпресс. (навороченный, планируется большой). Я делаю БД даю имя, а перед именем...

Приведите пожалуйста примеры затухающих и вынужденных колебаний в природе и технике, Укажите их вредное действие
Мало информации нащел на этот вопрос, помогите пожалуйста !!!

Желательно с комментариями.)
1. Тема &quot;Записи&quot;. Решение задач с применением пользовательского типа Запись Багаж пассажира...

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru