zarfaz
1

Динамически построить функцию, которая будет комбинацией заранее известных функций

18.09.2012, 21:14. Показов 569. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Цель - динамически построить функцию, которая будет комбинацией заранее известных функций.
Проблема - при попытке присвоить анонимному методу новое лямбда выражение от предыдущего (без рекурсии), присваения не происходит, а вместо этого копируется указатель на предедущую функцию, причем только в цикле.
Например следующий код вернет первые два элемента списка как и предполагается, а вот третий и четвертый элемент списка будут равны второму (Func1,Func2,Func2.Func2):
C#
1
2
3
4
5
6
7
8
9
10
11
            Func<int, int> f = (x) => x;
            List<Func<int, int>> Flist = new List<Func<int, int>>();
            Flist.Add(x => f(x)*2);
            for (int i = 1; i < 4; i++)
            {
                Flist.Add(x => Flist[i-1](x)*2);
            }
            if (Flist[1].Equals(Flist[2]))
            {
                //ПОЧЕМУ МЫ СЮДА ПОПАДАЕМ?
            }
Но если по коду выше в дебаггере можно увидеть, что со второго по четвертый элементы одинаковые, то в нижеследующем коде я теряюсь что не так:

C#
1
2
3
4
5
6
7
            Func<int, int> f = (x) => x; // создаем делегат, ок
            List<Func<int, int>> Flist = new List<Func<int, int>>();
            Flist.Add(x =>  f(x) * 2); //ссылаемся на делегат выше, никакой рекурсии
            Flist.Add(x => Flist[1](x)*2);
            Flist.Add(x => Flist[2](x)*2);
            Flist.Add(x => Flist[3](x)*2); //по идее должен вызвать предыдущий метод, тот еще предыдущий и так до базового
            int a = Flist[3](2); //вот здесь он выдает ошибку переполнения стека оО
Помогите понять что к чему или ткните носом, а то измученный выбился из сил искать ответ на просторах.
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.09.2012, 21:14
Ответы с готовыми решениями:

Построить программу машины Тьюринга, которая будет вычислять функцию
Необходимо построить программу машины Тьюринга, которая будет вычислять функцию f(x,y) = x + y - 1....

Построить функцию с именем noCalves, которая будет добавлена к прототипу объекта
Построить функцию с именем noCalves, которая будет добавлена к прототипу объекта. Если тип объекта...

.Написать функцию, которая будет возвращать значение y=ln(x)+x при входящем параметре x. Построить таблицу значений этой функции
.Написать функцию, которая будет возвращать значение y=ln(x)+x при входящем параметре x. Построить...

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

1
Эксперт Java
4088 / 3822 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
18.09.2012, 21:25 2
В первом случае - лямбды не простые, они захватывают локальную переменную i. замыкания
Функции которые вы добавляете в List не вычисляются же сразу и не фиксируются. Они вычисляются только при вызове.
То есть для компилятора не важно какое значение имеет i при объявлении, важно только то какое оно имеет при вызове самой функции. Отсюда он может сделать вывод, что все они - на самом деле одна и та же лямбда.

Во втором вы просто ошиблись с индексацией в списке. Она начинается с нуля, отсюда и рекурсия.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.09.2012, 21:25
Помогаю со студенческими работами здесь

Фильтр заранее известных колонок по типу данных
Добрый день, тут вопрос такой возник, если у меня есть список колонок, и мне нужно узнать их...

Можно ли в кейсы оператора switch() прописывать условия, вместо заранее известных значений ?
пытаюсь определенный промежуток хп (например от 20 до 40) вбить в условие кейса, не получается....

Написать функцию Факториал и программу, которая будет использовать эту функцию
Суть программы: Нужно написать функцию Факториал и программу.ю которая будет использовать эту...

Создать функцию, которая будет вызывать другую функцию
Доброго времени суток. Изучаю PHP и вот столкнулся с такой практикой, не знаю как реализовать....

Как в функцию передать функцию, которая будет слотом?
Как в функцию передать функцию, которая будет слотом? То, что написано в интернете и тут...

Решение системы уравнений: написать функцию, которая как параметр будет использовать другую функцию
Ребята помогите разобраться с указателем на функцию! у меня решается система ДУ методом...


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

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

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