Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Mr_Foster
0 / 0 / 1
Регистрация: 21.09.2013
Сообщений: 13
1

Перевод с рекурсивного в итерационный метод

27.09.2014, 23:46. Просмотров 531. Ответов 8
Метки нет (Все метки)

Перевод в итерационный метод.
Нужно убрать рекурсию.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
static void su(int[] m, int[] s, int i, int p, int l, int size, int corsize)   
        {
            for (; i < l; i++)
            {
                if (corsize + m[i] == size)
                {
                    for (int j = 0; j <= p; j++)
                    {
                        Console.Write("{0} + ", m[s[j]]);
                    }
                    Console.WriteLine("{0} = {1};", m[i], size);
                }
                else if (corsize + m[i] < size)
                {
                    s[p + 1] = i;
                    su(m, s, i + 1, p + 1, l, size, corsize + m[i]); // рекурсия
                }
            }
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.09.2014, 23:46
Ответы с готовыми решениями:

Перевод из рекурсивного метода в "обычный"
Перевод из рекурсивного метода. Нужно преобразовать программу в обычный вид....

Перевод с Pascal на C#. Метод Гаусса
Помогите ,пожалуйста, нужно перевести на С# program ideone; const n = 3; var...

Метод Беллмана-Форда(Перевод кода из C в C#)
Добрый день. Хочу попросить помочь решить возникшую проблему с переводом кода...

Распараллеливание рекурсивного метода
Реализую метод медианного сечения квантования изображений: ...

Исправить реализацию рекурсивного метода
Подскажите плиз, Что здесь неправильно using System; using...

8
rattrapper
foo();
864 / 568 / 221
Регистрация: 03.07.2013
Сообщений: 1,547
Записей в блоге: 2
28.09.2014, 00:10 2
Mr_Foster, объясните, что делает метод, а то с такими названиями переменных мозг вывихнуть можно
0
Mr_Foster
0 / 0 / 1
Регистрация: 21.09.2013
Сообщений: 13
28.09.2014, 00:38  [ТС] 3
Ввести массив с n целых чисел. Определить, можно ли с этих чисел выбрать такие, что их сумма равняется числу s. Если вариант существует, результат вывести на экран.
Например, входные данные: 7, 5, 4, 4, 1; s=10; 10 = 5+4+1.
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace alroritm33
{
    class Class1
    {
        static void su(int[] m, int[] s, int i, int p, int l, int size, int corsize)    
        {
            for (; i < l; i++)
            {
                if (corsize + m[i] == size)
                {
                    for (int j = 0; j <= p; j++)
                    {
                        Console.Write("{0} + ", m[s[j]]);
                    }
                    Console.WriteLine("{0} = {1};", m[i], size);
                }
                else if (corsize + m[i] < size)
                {
                    s[p + 1] = i;
                    su(m, s, i + 1, p + 1, l, size, corsize + m[i]); // рекурсия
                }
            }
        }
        static void summ(int[] m, int l, int size)
        {
            int[] s = new int[l];
            su(m, s, 0, -1, l, size, 0);
        }
        static void Main(string[] args)
        {
            int l = 5;                  // размер массива
            int[] m = new int[l];       // массив
            int a;                      // условное число
            Console.Write("Введите условное число: ");
            a = int.Parse(Console.ReadLine());
            for (int j = 0; j < l; j++)
            {
                Console.Write("Введите элемент массива: ");
                m[j] = int.Parse(Console.ReadLine());
            }
            summ(m, l, a);
        }
    }
}
0
rRczZZ
541 / 309 / 138
Регистрация: 08.02.2013
Сообщений: 609
28.09.2014, 01:11 4
Mr_Foster, а нужно именно переделать? есть вот такой интересный вариант, для небольших n
Кликните здесь для просмотра всего текста
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
static string Test(int Sum, int[] Array)
{
    // Выходная строка
    string[] @out = new string[Array.Length];
    int out_len;
    
    for (uint i = 0; i < 1 << Array.Length; i++ )
    {
        out_len = 0;
 
        // сумма для данного варианта
        int s = 0;
 
        for (uint j = 0, l = i; l != 0; j++, l >>= 1 )
        {
            if (l % 2 == 1)
            {
                s += Array[j];
                @out[out_len++] = Array[j].ToString();
            }
        }
 
        if (s == Sum)
        {
            return out_len == 0 ?
                "0 = " + Sum :
                String.Join(" + ", @out, 0, out_len) + " = " + Sum;
        }
    }
 
    return "не существует";
}
 
static void Main()
{
    int[] a = { 1, 2, 3, 4, 5 };
 
    Console.WriteLine(Test(2 + 4, a));
    Console.ReadLine();
}
0
Mr_Foster
0 / 0 / 1
Регистрация: 21.09.2013
Сообщений: 13
28.09.2014, 11:23  [ТС] 5
rRczZZ, да переделать, потому что мне потом нужно сравнить два метода(рекурсивным способом и итерационным) на быстродействие, по времени засечь.
0
Mr_Foster
0 / 0 / 1
Регистрация: 21.09.2013
Сообщений: 13
29.09.2014, 16:10  [ТС] 6
Проблема не решена
0
tarasalk
1196 / 711 / 285
Регистрация: 13.06.2013
Сообщений: 2,498
29.09.2014, 16:19 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
static void su(int[] m, int[] s, int i, int p, int l, int size, int corsize)   
     {
         bool flag=true;
         while(flag)
         {
            for (; i < l; i++)
            {
                if (corsize + m[i] == size)
                {
                    for (int j = 0; j <= p; j++)
                    {
                        Console.Write("{0} + ", m[s[j]]);
                    }
                    Console.WriteLine("{0} = {1};", m[i], size);
                }
                else if (corsize + m[i] < size)
                {
                    s[p + 1] = i;
                }
                else
                {
                 flag=false;
                 }
            }
         }
        }
Код не проврял, на глаз чисто. Думаю суть вы поняли.
0
Mr_Foster
0 / 0 / 1
Регистрация: 21.09.2013
Сообщений: 13
01.10.2014, 21:03  [ТС] 8
Может я чего-то не понимаю, но у меня не выходит.
Получилось один раз просчитать, но не все возможные варианты как с помощью рекурсии.
0
rattrapper
foo();
864 / 568 / 221
Регистрация: 03.07.2013
Сообщений: 1,547
Записей в блоге: 2
01.10.2014, 21:42 9
Mr_Foster, я бы рекурсивный так делал:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static bool CanCombineSumRec(int sum, List<int> numbers)
{
    for (int i = 0; i < numbers.Count; i++)
    {
        if (numbers[i] == sum) return true;
        if (numbers[i] > sum) continue;
        var temp = numbers[i];
        numbers.RemoveAt(i);
        if (CanCombineSumRec(sum - temp, numbers))
            return true;
        numbers.Insert(i, temp);
    }
    return false;
}
На счет итерационного нужно подумать

Добавлено через 1 минуту
блин, так не будет результата
0
01.10.2014, 21:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.10.2014, 21:42

Реализация рекурсивного алгоритма сортировки пузырьком
Реализовать сортировку пузырьком с помощью рекурсивных функций. Вот моя...

Выход из рекурсивного метода не осуществляется по Return
Почему-то после return опять рекурсию повторяет, мб я неправильно её написал ? ...

Реализация рекурсивного алгоритма сортировки выбором
Реализуйте рекурсивный алгоритм упорядочения по возрастанию заданного массива...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru