Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2011, 17:56   #1
Prizrak86
Форумчанин
 
Аватар для Prizrak86
 
Регистрация: 15.10.2011
Сообщений: 139
По умолчанию Как увеличить размер стека?

Как увеличить размер стека?

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Рекурсия
{
    class Program
    {
        static int rek(int n, int m)
        {
            if (n == 0)
            {
                return (m + 1);
            }
            else
            {
                if (m == 0)
                {
                    return (rek(n - 1, 1));
                }
                else
                {
                    return (rek(n - 1, rek(n, m - 1)));
                }

            }
        }
        static void Main(string[] args)
        {
            int n, m;
            for (n = 0; n <= 10; n++)
            {
                for (m = 0; m <= 10; m++)
                {
                    Console.WriteLine("n={0}, m={1}, A={2}",n, m, rek(n, m));
                }
                Console.WriteLine();
            }
            Console.ReadKey();
        }
    }
}
это пример вычисления рекурсии, при значении n=4, m=1 не хватает размера стека, как его увеличить, и возможно ли увеличение стека динамически?
Программист это не профессия, программист - это образ жизни.
Prizrak86 вне форума Ответить с цитированием
Старый 13.11.2011, 17:57   #2
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию

Учитесь называть темы правильно. Название темы - должно отражать суть вопроса. буду закрывать!
Alar вне форума Ответить с цитированием
Старый 13.11.2011, 18:06   #3
Guy
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 398
По умолчанию

Самый лучший выход - избавиться от рекурсии используя класс Stack.
Что то типо того

Stack<A> stack = new Stack<a> { };
A.Push(Начальное значение>;
while(A.Count != 0)
{
A val = stack.Pop();
//Работает с перменной на верхушке стека
....
//Если нада сделать рекурсивный вызов с новой переменной то
...
{
A.Push(Переменная);
continue;
}
}

Увеличение предоставленного системой стека для такой задачи плоха... Логика рекурсии сохраняется, но испольуется не стек а память приложения
Guy вне форума Ответить с цитированием
Старый 14.11.2011, 17:50   #4
Prizrak86
Форумчанин
 
Аватар для Prizrak86
 
Регистрация: 15.10.2011
Сообщений: 139
По умолчанию

Цитата:
Сообщение от Guy Посмотреть сообщение
Самый лучший выход - избавиться от рекурсии используя класс Stack.
Что то типо того

Stack<A> stack = new Stack<a> { };
A.Push(Начальное значение>;
while(A.Count != 0)
{
A val = stack.Pop();
//Работает с перменной на верхушке стека
....
//Если нада сделать рекурсивный вызов с новой переменной то
...
{
A.Push(Переменная);
continue;
}
}

Увеличение предоставленного системой стека для такой задачи плоха... Логика рекурсии сохраняется, но испольуется не стек а память приложения
а как это применить относительно моего кода?
Программист это не профессия, программист - это образ жизни.
Prizrak86 вне форума Ответить с цитированием
Старый 15.11.2011, 22:34   #5
Prizrak86
Форумчанин
 
Аватар для Prizrak86
 
Регистрация: 15.10.2011
Сообщений: 139
По умолчанию

но все же, как увеличить размер стека и как он рассчитывается?
при значениях n=4, m=1 компилятор судорожно понимает что перед ним рекурсия и начинает истерить, происходит это где то на 55-59 миллионах вызовах из себя же. как увеличить это число?
Программист это не профессия, программист - это образ жизни.

Последний раз редактировалось Prizrak86; 16.11.2011 в 00:06.
Prizrak86 вне форума Ответить с цитированием
Старый 16.11.2011, 08:28   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Проблема не в размере стэка.
Проблема в этом условии:
Код:
                if (m == 0)
                {
                    return (rek(n - 1, 1));
                }
Посмотрите что тут получается при n == 1.
По сути, идёт постоянный вызов rek(1,0) и выхода из этого замкнутого круга нет.
pu4koff вне форума Ответить с цитированием
Старый 16.11.2011, 08:38   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Рекурсию к тому иногда можно привести к циклу. Попробуйте переформулировать условие задачи.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 16.11.2011, 18:37   #8
Prizrak86
Форумчанин
 
Аватар для Prizrak86
 
Регистрация: 15.10.2011
Сообщений: 139
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Проблема не в размере стэка.
Проблема в этом условии:
Код:
                if (m == 0)
                {
                    return (rek(n - 1, 1));
                }
Посмотрите что тут получается при n == 1.
По сути, идёт постоянный вызов rek(1,0) и выхода из этого замкнутого круга нет.
так дано в условии задачи, а по сути, параметр m передает здесь значение 1, а так как проверяется сначала параметр n то "зацикливания" не будет.

при вхождении с параметром n==1 && m==1 вычисление идет по двум рекурсия вложенных друг в друга, если передает параметры n==0 && m==1 то рекурсия в последствии не выполняется, а результат работы будет m=m+1; т.е. 2.
Программист это не профессия, программист - это образ жизни.

Последний раз редактировалось Prizrak86; 16.11.2011 в 18:46.
Prizrak86 вне форума Ответить с цитированием
Старый 16.11.2011, 18:41   #9
Prizrak86
Форумчанин
 
Аватар для Prizrak86
 
Регистрация: 15.10.2011
Сообщений: 139
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Рекурсию к тому иногда можно привести к циклу. Попробуйте переформулировать условие задачи.
к сожаления в условии задачи четко прописано что при выполнении конкретных условий должна вызывать ту же систему уравнений только с измененными входными параметрами.
Программист это не профессия, программист - это образ жизни.
Prizrak86 вне форума Ответить с цитированием
Старый 17.11.2011, 11:24   #10
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Prizrak86 Посмотреть сообщение
так дано в условии задачи, а по сути, параметр m передает здесь значение 1, а так как проверяется сначала параметр n то "зацикливания" не будет.

при вхождении с параметром n==1 && m==1 вычисление идет по двум рекурсия вложенных друг в друга, если передает параметры n==0 && m==1 то рекурсия в последствии не выполняется, а результат работы будет m=m+1; т.е. 2.
Да. Чего-то я напутал там. Но всё равно склоняюсь к мнению, что где-то происходит зацикливание и рекурсия получается бесконечная.
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как увеличить размер БД? Sergey Bi. старший БД в Delphi 5 07.04.2011 21:50
Увеличить размер точки OptionButton Sergey112233 Microsoft Office Excel 4 30.12.2010 22:47
Как увеличить выборку? NiYa Microsoft Office Excel 1 03.05.2010 17:05
как увеличить максимальный размер структурных типов? bullvinkle Паскаль, Turbo Pascal, PascalABC.NET 0 19.12.2008 09:54