⚙️ Алгоритмы  ·  20 вопросов  ·  ~45 мин  ·  ⏱ Таймер 45:00  ·  Сложный  · 

Перебор и возврат с откатом

Возврат с откатом — это не просто рекурсия с циклом. Каждая ветвь должна получить чистое родительское состояние, а любое отсечение обязано исключать только заведомо бесполезные продолжения. В тесте есть перестановки, сочетания, подмножества, ферзи, копирование путей и оценки пространства поиска.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Выбери один ответ из четырёх. В тесте 20 вопросов и 45 минут. После завершения откроются общий процент, четыре тематические шкалы, правильные ответы и пояснения.
Вопрос 1 из 20
Сколько листьев посетит полный перебор двоичных строк длины 5?
2^5=32
Python
count = 0
def gen(pos, n):
    global count
    if pos == n:
        count += 1
        return
    gen(pos + 1, n)
    gen(pos + 1, n)
gen(0, 5)
print(count)
Вопрос 2 из 20
Сколько перестановок будет напечатано?
Python
def perm(path, remaining):
    if not remaining:
        print(path)
        return
    for i in range(len(remaining)):
        perm(path + [remaining[i]], remaining[:i] + remaining[i+1:])

perm([], [1, 2, 3])
Вопрос 3 из 20
Какова грубая сложность полного перебора всех подмножеств n элементов, если проверка каждого занимает O(n)?
O(n\,2^n)
Вопрос 4 из 20
Сколько узлов дерева, включая неполные префиксы, создаст функция?
Python
calls = 0
def build(pos):
    global calls
    calls += 1
    if pos == 3:
        return
    for _ in range(2):
        build(pos + 1)
build(0)
print(calls)
Вопрос 5 из 20
Какой порядок выбора переменных часто уменьшает дерево поиска в задачах ограничений?
Вопрос 6 из 20
Почему функция печатает неверные пути?
Python
path = []
def gen(n):
    if len(path) == n:
        print(path)
        return
    for x in [0, 1]:
        path.append(x)
        gen(n)
        # пропущено действие
Вопрос 7 из 20
Какой список останется после завершения вызова?
Python
path = []
def gen(pos):
    if pos == 2:
        return
    for x in [1, 2]:
        path.append(x)
        gen(pos + 1)
        path.pop()
gen(0)
print(path)
Вопрос 8 из 20
Что должно быть истинно после отката из рекурсивного вызова?
Вопрос 9 из 20
Какой дефект связан с добавлением path напрямую?
Python
answers = []
path = []
def save():
    answers.append(path)

path.append(1); save(); path.pop()
path.append(2); save(); path.pop()
print(answers)
Вопрос 10 из 20
Когда копирование состояния вместо отката может быть разумным?
Вопрос 11 из 20
Какое отсечение безопасно в задаче набора положительных чисел до суммы target?
Python
def search(i, total):
    if total > target:
        return
    ...
Вопрос 12 из 20
Почему это отсечение может быть неверным при отрицательных числах?
Python
def search(current_sum, target):
    if current_sum > target:
        return
    # здесь продолжается перебор оставшихся чисел
    ...
Вопрос 13 из 20
В задаче минимизации найдено решение стоимости best. Когда ветвь можно безопасно отсечь?
Вопрос 14 из 20
Сколько размещений ферзей проверит база после отсечения по занятым столбцам для n=4?
Python
def count_placements(row, used_columns, n):
    if row == n:
        return 1
    total = 0
    for column in range(n):
        if column not in used_columns:
            used_columns.add(column)
            total += count_placements(row + 1, used_columns, n)
            used_columns.remove(column)
    return total

print(count_placements(0, set(), 4))
# Диагонали пока не проверяются.
Вопрос 15 из 20
Как выбор следующего кандидата по эвристике влияет на корректность, если никакие ветви не удаляются?
Вопрос 16 из 20
Какие сочетания длины 2 будут сгенерированы?
Python
a = [1, 2, 3, 4]
out = []
def choose(start, path):
    if len(path) == 2:
        out.append(path.copy())
        return
    for i in range(start, len(a)):
        path.append(a[i])
        choose(i + 1, path)
        path.pop()
choose(0, [])
print(out)
Вопрос 17 из 20
Сколько уникальных перестановок у [1,1,2]?
Python
# одинаковые единицы не различаются
Вопрос 18 из 20
Как избежать дублей при генерации перестановок массива с повторами?
Вопрос 19 из 20
Сколько подмножеств будет добавлено?
Python
a = [1, 2, 3]
out = []
def subsets(i, path):
    if i == len(a):
        out.append(path.copy())
        return
    subsets(i + 1, path)
    path.append(a[i])
    subsets(i + 1, path)
    path.pop()
subsets(0, [])
print(len(out))
Вопрос 20 из 20
Чем размещения отличаются от сочетаний?
P(n,k)=\frac{n!}{(n-k)!},\quad C(n,k)=\frac{n!}{k!(n-k)!}

Ответьте на все 20 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу