Суперпозицией
функций
f1,
…, fm
называется функция f,
полученная с помощью подстановок этих
функций друг в друга и переименования
переменных, а формулой
называется выражение, описывающее эту
суперпозицию.
Пусть
дано множество (конечное или бесконечное)
исходных функций å={f1,
…, fm}.
Символы переменных х1,
…, хn,
… и констант 0 и 1считают формулами
глубины 0.
Любая формула имеет глубину
k+1,
если она имеет вид fi(F1,
…, Fnl),
где fiSÎ,
ni
— количество аргументов fi,
а F1,
…, Fnl
— формулы, максимальная из глубин
которых равна k.
F1,
…, Fnl
называются
подформулами
F,
fi
называется
внешней
или главной
операцией формулы F.
Все подформулы формул F1,
…, Fnl
— также считаются подформулами F.
Все
формулы, содержащие только символы
переменных, скобки и знаки функций из
множества å,
называются формулами
над å.
Формула
каждому набору значений аргументов
ставит в соответствие значение функции
и, следовательно, может служить наряду
с таблицей способом задания и вычисления
функции. О формуле, задающей функцию,
говорят также, что она реализует
или представляет
эту функцию.
Способы
записи:
-
префиксная
или прямая
польская
запись (and(x,
or(y,
z)); -
Знак
бинарной
операции или функции часто записывают
между операндами — такая нотация
называется инфиксной
xÙ(yÚz)
или x
and
(y
or
z); -
обратная
польская
(или постфиксная)
запись —знак функции или операции
располагается после списка x
y
z
Ú
Ù
Функционально
полные базисы. Булева алгебра логических
операций. Основные эквивалентные
соотношения (законы) в булевой алгебре.
Система
булевых функций {f1,…,fn}
называется полной,
если любая булева функция мб выражена
через функции f1,…,
fn
с помощью суперпозиций (т.е. составления
сложных функций). Формулой называется
выражение, описывающее эту суперпозицию.
Формулы,
содержащие кроме переменных и скобок
знаки этих функций(дизъюнкции, конъюнкции
и отрицания) называются булевыми.
Всякая
логическая функция может быть представлена
булевой формулой, т.е. как суперпозиция
дизъюнкции, конъюнкции и отрицания.
Следствие:
система булевых функций функциональна
полна.
Алгебра
(Р2; &, Ú,
Ø),
основным множеством которой является
множество всех логических функций Р2,
а операциями дизъюнкция, конъюнкция и
отрицание, называется
булевой
алгеброй логических операций.
Основные
эквивалентные соотношения (законы) в
булевой алгебре:
ассоциативностей
aÚ(bÚc)=(aÚb)Úc,
aÙ(bÙc)=(aÙb)Ùc;
коммутативностей
aÚb=bÚa,
aÙb=bÙa;
дистрибутивностей
aÙ(bÚc)=aÙbÚaÙc;
aÚbÙc=(aÚb)Ù(aÚc);
идемпотентностей
aÚa=a,
aÙa=a;
двойного
отрицания
ØØa=a;
законы
нуля
(лжи)
aÚ0=a,
aÙ0=0,
aØÙa=0;
законы
единицы (истины) aÚ1=1,
aÙ1=a,
aØÚa=1.
де-Моргана
ØaØÚb=Ø(aÙb),
ØaØÙb=Ø(aÚb);
противоречия
aÙØа=0
исключенного
третьего aÚØа=1
Для
упрощения формул наряду с основными
соотношениями используют также тождества:
поглощения
aÚaÙb=a,
aÙ(aÚb)=a;
склеивания
aÙbÚaØÙb=a,
(aÚb)Ù(aØÚb)=a;
обобщенное
склеивание aÙcÚbØÙcÚaÙb
=aÙcÚbØÙc;
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
Можно ли получить глубину рекурсии?
Могу ли я узнать глубину рекурсии из функции?
Например, мне нужно чтобы если глубина рекурсии приближалась к лимиту она завершалась.
-
Вопрос заданболее года назад
-
292 просмотра
Пригласить эксперта
Что-то вроде такого
def recursion_func(..., level=0):
...
recursion_func(..., level=level+1)
Регулировать глобальный лимит рекурсии можно с помощью соответствующих функций из модуля os:
import sys
print(sys.getrecursionlimit()) # Получить текущий лимит рекурсии
sys.setrecursionlimit(1500) # Установить лимит рекурсии в 1500
Внутри отдельной функции можно ограничить количество рекурсивных вызовов с помощью специального параметра-счётчика, например, так (LIMIT не должен превышать глобальный лимит рекурсии):
LIMIT = 1500
def test(calls=0):
...
if calls >= LIMIT:
return
return test(..., calls=calls + 1)
-
Показать ещё
Загружается…
17 мая 2023, в 09:29
25000 руб./за проект
17 мая 2023, в 09:11
500 руб./за проект
17 мая 2023, в 08:58
500 руб./за проект
Минуточку внимания
Как я могу найти текущую глубину внутри рекурсивной функции в C++ без прохождения предыдущего уровня? т. е. Можно ли узнать, сколько раз вызывалась функция без использования параметра для отслеживания уровня и передачи этого числа в качестве параметра каждый раз, когда вызывается функция?
моя рекурсивная функция выглядит так:
DoSomething(int level)
{
print level;
if (level > 10)
return;
DoSomething(++level);
}
main
{
DoSomething(0);
}
7 ответов
основываясь на ответе, уже данном JoshD:
void recursive()
{
static int calls = 0;
static int max_calls = 0;
calls++;
if (calls > max_calls)
max_calls = calls;
recursive();
calls--;
}
это сбрасывает счетчик после завершения рекурсивной функции, но по-прежнему отслеживает максимальную глубину рекурсии.
Я бы не использовал статические переменные, подобные этому, ни для чего, кроме быстрого теста, который будет удален вскоре после этого. Если вам действительно нужно отслеживать это на постоянной основе, есть лучшие методы.
вы можете использовать статическую переменную в функции…
void recursive()
{
static int calls = 0;
calls++;
recursive();
}
конечно, это будет продолжать подсчет при запуске нового исходного вызова….
Вы можете использовать локальную статическую переменную, если вы не заботиться о потокобезопасности.
хотя это даст вам правильный подсчет только при первом запуске рекурсивной процедуры. Лучшим методом будет класс типа RAII guard, который содержит внутреннюю статическую переменную. В начале рекурсивной процедуры создайте класс guard. Конструктор увеличит внутреннюю статическую переменную,а деструктор уменьшит ее. Таким образом, когда вы создаете новый stack-frame счетчик увеличивается на единицу, и когда вы возвращаетесь из каждого стека-кадра, счетчик будет уменьшаться на единицу.
struct recursion_guard
{
recursion_guard() { ++counter; }
~recursion_guard() { --counter; }
static int counter;
};
int recursion_guard::counter = 0;
void recurse(int x)
{
recursion_guard rg;
if (x > 10) return;
recurse(x + 1);
}
int main()
{
recurse(0);
recurse(0);
}
обратите внимание, однако, что это все еще не потокобезопасно. Если вам нужна потокобезопасность, вы можете заменить переменную static-storage переменной thread-local-storage, используя boost::thread_specific_ptr
или локальные объекты потока C++0x.
Если вы хотите, чтобы он был повторным и потокобезопасным, почему бы и нет:
void rec(int &level) // reference to your level var
{
// do work
rec(++level); // go down one level
}
main()
{
//and you call it like
int level=0;
rec(level);
cout<<level<<" levels."<<endl;
}
нет статических/глобальных переменных чтобы испортить резьбу, и вы можете использовать разные переменные для разных рекурсивных цепочек для проблем повторного входа.
вы также можете передать уровень в качестве параметра шаблона, если он может быть определен во время компиляции. Вы также можете использовать объект функции. Это, безусловно, лучший вариант – меньше хлопот, и статических переменных следует избегать везде, где это возможно.
struct DoSomething {
DoSomething() {
calls = 0;
}
void operator()() {
std::cout << calls;
calls++;
if (calls < 10)
return operator()();
return;
}
int calls;
};
int main() {
DoSomething()(); // note the double ().
std::cin.get();
}
преобразование level
к переменной экземпляра нового объекта (обычно шаблона), способной содержать аргументы и (возможно) функцию. затем вы можете повторно использовать интерфейс recursion accumulator.
вы также можете попробовать использовать глобальную переменную для регистрации глубины.
var depth = 0;
DoSomething()
{
print ++depth;
if (depth > 10)
return;
DoSomething();
}
main
{
DoSomething(0);
}
Добавлено 16 июня 2021 в 09:09
Рекурсивная функция в C++ – это функция, которая вызывает сама себя. Вот пример плохо написанной рекурсивной функции:
#include <iostream>
void countDown(int count)
{
std::cout << "push " << count << 'n';
countDown(count-1); // countDown() вызывает себя рекурсивно
}
int main()
{
countDown(5);
return 0;
}
Когда вызывается countDown(5)
, печатается “push 5” и вызывается countDown(4)
. countDown(4)
печатает “push 4” и вызывает countDown(3)
. countDown(3)
печатает “push 3” и вызывает countDown(2)
. Последовательность countDown(n)
, вызывающих countDown(n-1)
, повторяется бесконечно, образуя рекурсивный эквивалент бесконечного цикла.
В уроке «11.8 – Стек и куча» вы узнали, что каждый вызов функции вызывает размещение данных в стеке вызовов. Поскольку функция countDown()
никогда не возвращается (она просто снова вызывает countDown()
), эта информация никогда не извлекается из стека! Следовательно, в какой-то момент на компьютере закончится стековая память, произойдет переполнение стека, и программа вылетит со сбоем или завершится. На машине автора эта программа отсчитала до -11732 перед завершением!
Условия завершения рекурсии
Рекурсивные вызовы функций обычно работают так же, как и обычные вызовы функций. Однако приведенная выше программа иллюстрирует наиболее важное отличие рекурсивных функций: вы должны включить условие завершения рекурсии, иначе они будут работать «вечно» (на самом деле, пока стек вызовов не исчерпает память). Завершение рекурсии – это условие, при выполнении которого рекурсивная функция перестает вызывать себя.
Завершение рекурсии обычно включает в себя использование оператора if
. Вот наша функция, переработанная с условием завершения (и некоторым дополнительным выводом):
#include <iostream>
void countDown(int count)
{
std::cout << "push " << count << 'n';
if (count > 1) // условие завершения
countDown(count-1);
std::cout << "pop " << count << 'n';
}
int main()
{
countDown(5);
return 0;
}
Теперь, когда мы запустим нашу программу, countDown()
будет выводить следующий текст:
push 5
push 4
push 3
push 2
push 1
Если вы посмотрите на стек вызовов на этом этапе, вы увидите следующее:
countDown(1)
countDown(2)
countDown(3)
countDown(4)
countDown(5)
main()
Из-за условия завершения countDown(1)
не вызывает countDown(0)
(поскольку «условная инструкция if
» не выполнится), и поэтому функция печатает “pop 1” и затем завершается. В этот момент countDown(1)
извлекается из стека, а управление возвращается к countDown(2)
. countDown(2)
возобновляет выполнение в точке после вызова countDown(1)
, выводит “pop 2” и затем завершается. Рекурсивные вызовы функций последовательно извлекаются из стека до тех пор, пока не будут удалены все экземпляры countDown
.
Таким образом, эта программа в итоге печатает:
push 5
push 4
push 3
push 2
push 1
pop 1
pop 2
pop 3
pop 4
pop 5
Стоит отметить, что вывод сообщений “push” происходит в прямом порядке, поскольку они выводятся до вызова рекурсивной функции. Вывод сообщений “pop” происходит в обратном порядке, потому что они выводятся после вызова рекурсивной функции по мере того, как функции извлекаются из стека (что происходит в порядке, обратном порядку, в котором они были помещены).
Более полезный пример
Теперь, когда мы обсудили базовую механику рекурсивных вызовов функций, давайте взглянем на другую рекурсивную функцию, которая немного более типична:
// возвращаем сумму всех целых чисел от 1 (включительно) до sumto (включительно)
// возвращает 0 для отрицательных чисел
int sumTo(int sumto)
{
if (sumto <= 0)
{
// базовый случай (условие завершения), когда пользователь передал
// неожиданный параметр (0 или отрицательное значение)
return 0;
}
else if (sumto == 1)
{
// нормальный базовый случай (условие завершения)
return 1;
}
else
{
// рекурсивный вызов функции
return sumTo(sumto - 1) + sumto;
}
}
Рекурсивные программы часто трудно понять, просто взглянув на них. Часто бывает информативнее посмотреть, что происходит, когда мы вызываем рекурсивную функцию с определенным значением. Итак, давайте посмотрим, что произойдет, когда мы вызовем эту функцию с параметром sumto
= 5.
Вызывается sumTo(5), 5 <= 1 ложно, поэтому мы возвращаем sumTo(4) + 5.
Вызывается sumTo(4), 4 <= 1 ложно, поэтому мы возвращаем sumTo(3) + 4.
Вызывается sumTo(3), 3 <= 1 ложно, поэтому мы возвращаем sumTo(2) + 3.
Вызывается sumTo(2), 2 <= 1 ложно, поэтому мы возвращаем sumTo(1) + 2.
Вызывается sumTo(1), 1 <= 1 истинно, поэтому мы возвращаем 1. Это условие завершения.
Теперь мы раскручиваем стек вызовов (извлекая каждую функцию из стека вызовов по мере ее возврата):
sumTo(1) возвращает 1.
sumTo(2) возвращает sumTo(1) + 2, что равно 1 + 2 = 3.
sumTo(3) возвращает sumTo(2) + 3, что равно 3 + 3 = 6.
sumTo(4) возвращает sumTo(3) + 4, что равно 6 + 4 = 10.
sumTo(5) возвращает sumTo(4) + 5, что равно 10 + 5 = 15.
На этом этапе легче увидеть, что мы складываем числа между 1 и переданным значением (оба включительно).
Поскольку рекурсивные функции трудно понять, просто посмотрев на них, особенно важны хорошие комментарии.
Обратите внимание, что в приведенном выше коде мы рекурсивно используем значение sumto - 1
, а не --sumto
. Мы делаем это, потому что operator--
имеет побочный эффект, а использование переменной, к которой применяется побочный эффект, более одного раза в заданном выражении, приведет к неопределенному поведению. Использование sumto - 1
позволяет избежать побочных эффектов, что делает более безопасным использование sumto
в выражении более одного раза.
Рекурсивные алгоритмы
Рекурсивные функции обычно решают задачу, сначала находя решение подмножества задачи (рекурсивно), а затем, изменяя это подрешение, чтобы перейти к решению. В приведенном выше алгоритме sumTo(value)
сначала решает sumTo(value-1)
, а затем добавляет значение переменной value
, чтобы найти решение для sumTo(value)
.
Во многих рекурсивных алгоритмах некоторые входные данные дают тривиальные результаты. Например, sumTo(1)
имеет тривиальный результат 1 (вы можете вычислить это в уме), и нет выигрыша от дальнейшей рекурсии. Входные данные, для которых алгоритм создает выходные данные тривиально, называются базовым случаем. Базовые случаи действуют как условия завершения работы алгоритма. Базовые случаи часто можно определить, рассматривая выходные данные для входных значений 0, 1, “”, ” или null
.
Числа Фибоначчи
Одним из самых известных математических рекурсивных алгоритмов является последовательность Фибоначчи. Последовательности Фибоначчи появляются во многих местах в природе, таких как ветвление деревьев, спираль ракушек, плоды ананаса, раскручивающаяся ветка папоротника и устройство сосновой шишки.
Вот изображение спирали Фибоначчи:
Каждое из чисел Фибоначчи – это длина стороны квадрата, в которой находится это число.
Числа Фибоначчи определяются математически как:
(begin{equation*} F(n) = begin{cases} 0 & если n = 0\ 1 & если n = 1\ f(n-1) + f(n-2) & если n > 0\ end{cases} end{equation*})
Следовательно, для вычисления n-го числа Фибоначчи довольно просто написать (не очень эффективную) рекурсивную функцию:
#include <iostream>
int fibonacci(int count)
{
if (count == 0)
return 0; // базовый случай (условие завершения)
if (count == 1)
return 1; // базовый случай (условие завершения)
return fibonacci(count-1) + fibonacci(count-2);
}
// И основная программа для отображения первых 13 чисел Фибоначчи
int main()
{
for (int count=0; count < 13; ++count)
std:: cout << fibonacci(count) << " ";
return 0;
}
Запуск этой программы дает следующий результат:
0 1 1 2 3 5 8 13 21 34 55 89 144
Вы можете заметить, что это именно те числа, которые появляются на диаграмме спирали Фибоначчи.
Алгоритмы мемоизации
Показанный выше рекурсивный алгоритм Фибоначчи не очень эффективен отчасти потому, что каждый вызов небазового случая Фибоначчи приводит к еще двум вызовам Фибоначчи. Это приводит к экспоненциальному росту количества вызовов функции (фактически, в приведенном выше примере функция fibonacci()
вызывается 1205 раз!). Существуют методы, которые можно использовать для уменьшения количества необходимых вызовов. Один метод, называемый мемоизацией, кэширует результаты дорогостоящих вызовов функций, чтобы результат мог быть возвращен, когда те же входные данные повторяются снова.
Вот мемоизированная версия рекурсивного алгоритма Фибоначчи:
#include <iostream>
#include <vector>
int fibonacci(int count)
{
// Мы будем использовать статический std::vector
// для кеширования вычисленных результатов
static std::vector<int> results{ 0, 1 };
// Если мы уже видели этот count, то используем результат кеширования
if (count < static_cast<int>(std::size(results)))
return results[count];
else
{
// В противном случае вычисляем новый результат и складываем его
results.push_back(fibonacci(count - 1) + fibonacci(count - 2));
return results[count];
}
}
// И основная программа для отображения первых 13 чисел Фибоначчи
int main()
{
for (int count = 0; count < 13; ++count)
std::cout << fibonacci(count) << " ";
return 0;
}
Эта мемоизированная версия выполняет 35 вызовов функции, что намного лучше, чем 1205 вызовов у исходного алгоритма.
Рекурсия против итераций
О рекурсивных функциях часто задают вопрос: «Зачем использовать рекурсивную функцию, если вы можете выполнять многие из тех же задач итеративно (используя цикл for
или while
)?». Оказывается, вы всегда можете решить рекурсивную задачу итеративно, однако для нетривиальных задач рекурсивную версию часто намного проще написать (и читать). Например, хотя функцию Фибоначчи можно написать итеративным способом, но это будет немного сложнее! (Попробуйте!)
Итерационные функции (использующие цикл for
или while
) почти всегда более эффективны, чем их рекурсивные аналоги. Это связано с тем, что каждый раз, когда вы вызываете функцию, появляются некоторые накладные расходы, связанные с добавлением и извлечением кадров стека. Итерационные функции избегают этих накладных расходов.
Это не значит, что итерационные функции всегда лучший выбор. Иногда рекурсивная реализация функции настолько чище и проще в использовании, что небольшие дополнительные накладные расходы более чем окупаются с точки зрения поддерживаемости, особенно если алгоритму не требуется повторяться слишком много раз, чтобы найти решение.
В общем, рекурсия – хороший выбор, когда выполняется большинство из следующих утверждений:
- рекурсивный код реализовать намного проще;
- глубина рекурсии может быть ограничена (например, нет способа предоставить входные данные, которые заставят функцию рекурсивно пройти вниз 100 000 уровней);
- итерационная версия алгоритма требует управления стеком данных;
- это не критичный для производительности раздел кода.
Однако если рекурсивный алгоритм реализовать проще, может иметь смысл начать с него, а затем, позже оптимизировать до итеративного алгоритма.
Правило
Как правило, предпочтение отдают итерации, а не рекурсии, за исключением случаев, когда рекурсия действительно имеет смысл.
Небольшой тест
Вопрос 1
Факториал целого числа N (пишется N!) определяется как произведение всех чисел от 1 до N (0! = 1). Напишите рекурсивную функцию с именем factorial
, которая возвращает факториал входных данных. Проверьте это с первыми 7 факториалами.
Подсказка: помните, что (x * y) = (y * x), поэтому произведение всех чисел от 1 до N равно произведению всех чисел от N до 1.
Ответ
#include <iostream> int factorial(int n) { if (n <= 0) return 1; else return factorial(n - 1) * n; } int main() { for (int count = 0; count < 7; ++count) std::cout << factorial(count) << 'n'; }
Вопрос 2
Напишите рекурсивную функцию, которая принимает на вход целое число и возвращает сумму отдельных цифр этого целого числа (например, 357 = 3 + 5 + 7 = 15). Выведите ответ на входное значение 93427 (то есть 25). Предположим, что входные значения положительны.
Ответ
#include <iostream> int sumNumbers(int x) { if (x < 10) return x; else return sumNumbers(x / 10) + x % 10; } int main() { std::cout << sumNumbers(93427); }
Вопрос 3
Немного сложнее. Напишите программу, которая просит пользователя ввести положительное целое число, а затем использует рекурсивную функцию для печати двоичного представления этого числа. Воспользуйтесь методом 1 из урока «O.4 – Преобразование между двоичной и десятичной системами счисления».
Подсказка: используя метод 1, мы хотим печатать биты «снизу вверх», что означает в обратном порядке. Это означает, что ваша инструкция печати должна быть после рекурсивного вызова.
Ответ
#include <iostream> void printBinary(int x) { // Условие завершения if (x == 0) return; // Рекурсия к следующему биту printBinary(x / 2); // Распечатываем остатки (в обратном порядке) std::cout << x % 2; } int main() { int x; std::cout << "Enter a positive integer: "; std::cin >> x; printBinary(x); }
Вопрос 4
Обновите свой код из задания 3, чтобы обработать случай, когда пользователь может ввести 0 или отрицательное число.
Вот пример вывода программы (при условии, что int
занимает 32 бита):
Enter an integer: -15
11111111111111111111111111110001
Подсказка: отрицательное число int
можно превратить в положительное значение, преобразовав его в unsigned int
. Они имеют идентичные битовые представления (тип используется для определения того, как интерпретировать число в десятичном виде).
Ответ
#include <iostream> void printBinary(unsigned int n) { // мы выполняем рекурсию, только если n > 1, // поэтому наш случай завершения для n == 0 if (n > 1) { printBinary(n / 2); } std::cout << n % 2; } int main() { int x{}; std::cout << "Enter an integer: "; std::cin >> x; printBinary(static_cast<unsigned int>(x)); }
Теги
C++ / CppLearnCppДля начинающихМемоизацияОбучениеПрограммированиеРекурсияСтек вызововЧисла Фибоначчи / Fibonacci numbers
это моя функция Foo:
def Foo(n=10):
if 1<n<=10:
for i in range(1, 10):
#### Do_Something
Foo(n-1)
Я получаю RuntimeError: maximum recursion depth exceeded
, что разочаровывает, так как я ожидал, что глубина рекурсии Foo будет 10+, нигде не будет пределов 500 по умолчанию для python. Я знаю, что с этим Foo я получаю огромное количество стеков, но это терпимо. Я пытался увеличить sys.setrecursionlimit
и все еще получаю RuntimeError. Какие-либо предложения?
26 окт. 2012, в 16:05
Поделиться
Источник
2 ответа
Документация sys.setrecursionlimit
указывает, что предел рекурсии на самом деле является глубиной стека python.
EDIT Я не знаю, почему вы нажимаете предел рекурсии, но вы, вероятно, не бьетесь из-за этой функции (я изменил ее так, чтобы она печатала максимальное количество раз в стеке):
count = 0
maxcount = 0
def Foo(n=10):
global count
global maxcount
count = count + 1
if(count > maxcount):
maxcount = count
print maxcount
if 1<n<=10:
for i in range(1, 10):
#### Do_Something
Foo(n-1)
count = count - 1
Foo(10)
mgilson
26 окт. 2012, в 11:10
Поделиться
В моих расчетах произошла ошибка. Функция фактически не падает на foo (10), а просто делает 4 миллиарда звонков, но останавливается правильно.
Timothy Lawman
26 окт. 2012, в 12:20
Поделиться
Ещё вопросы
- 1Java Web Start Предупреждение о безопасности JNLP. Ошибка в JWS? 7u51
- 1hibernate 4 и joda-LocalDate и сохраните его как дату SQL
- 0Как запрашивать данные из ссылок в AngularFire
- 0Как добавить правило в редактор RichText с помощью плагина jquery.validate.js?
- 0GCC – определить мою собственную опцию командной строки, которая добавляет список опций
- 1Скопируйте большие файлы максимально быстро
- 1Что за выражение «throws» используется здесь, а что, если не используется?
- 0Combobox не применяется в поле выбора
- 1Программа NullPointerException LifeGame.java
- 0ОШИБКА: cout c ++ необъявленный
- 0Как разместить фоновое изображение за набором радиокнопок
- 1Как передать больше параметров в метод Spring Spring
- 0unordered_set передать по адресу
- 0MySQL не возвращает массив в angularJS
- 1ReactiveUI: Как отменить Observable от ReactiveCommand?
- 1Проблема: Перекомпилировать с -Xlint: не проверено для деталей
- 0Как использовать $ sce.trustAsHtml с некоторым узлом HTML
- 0Node.js Чекбокс Итерация
- 1Вставить несколько строк с циклом for в строку, созданную с помощью readlines ()
- 0Как сделать снимок конечного результата после удаления элемента на изображение с помощью JavaScript?
- 0Живые данные не отправляются с использованием ненавязчивой проверки MVC 4.5
- 0Как динамически изменить шаблон поповера в angular-strap
- 0$ _POST в пределах heredoc php
- 0Ошибка проверки формы при использовании тега ion-scroll
- 0Хотите показать все значения данных в своей группе с заголовком в CGridview в yii
- 1Как получить текущее имя файла из функции внутри другого файла?
- 0Выполнение PHP-файла из командной строки с динамическими параметрами
- 1Добавление минут к метке времени в python
- 1Получение автоматически сгенерированного идентификатора при вставке в roomDatabase
- 0Как внедрить контроллер как зависимость при использовании нотации «Контроллер как»?
- 03 столбца делятся не по горизонтали
- 0AngularJS анализирует данные JSON с переменной области видимости
- 0Как настроить абстрактное состояние в качестве фона в AngularJS
- 0Доступ к индивидуальному свойству из SimpleXMLElement Object
- 0C ++ VS2010 с использованием параллелизма пространства имен; Нет пространства имен с этим именем
- 1Как закрыть полноэкранную рекламу, не нажимая кнопку закрытия?
- 0Windows-сокеты accept () возвращают неверное значение
- 0Как подключиться к серверу sql используя php в xampp
- 0Идентификатор возвращает 0 для API отдыха с Go
- 1Javascript, имя функции с интерполяцией строк [дубликаты]
- 0как предотвратить переход курсора на следующую строку в текстовой области с помощью jquery
- 0Убедитесь, что флажки установлены на странице перезагрузки JQuery
- 1Десериализовать JSON C #
- 0условный CSS для т.е. 10 и Mozilla в asp.net
- 0недопустимые типы ‘float * [float]’ для индекса массива
- 1Узел JS Как отправить изображение вместе с запросом данных на другой сервер / API
- 1Чтение значения файлов cookie в веб-клиенте с поддержкой файлов cookie
- 1Java Deep Clone – клонировать каждый элемент в ArrayList, если Cloneable, независимо от типа
- 0JQuery обходится, чтобы добавить класс
- 1Xpath: найти div, который следует за известным div (не вложенным)