Автор | Сообщение |
|
Отправлено: 21.01.24 15:14. Заголовок: Не получается решить задание ЕГЭ 23 №6500
def f(start, finish, counter): if start > finish or start == 11 or start == 35 or counter > 5: return 0 if start == finish: return 1 if start < finish: return f(start + 1, finish, counter + 1) + f(start + 3, finish, counter) + f(start * 2, finish, counter) print(f(2, 18, 0) * f(18, 40, 5)) print(f(2, 18, 1) * f(18, 40, 4)) print(f(2, 18, 2) * f(18, 40, 3)) print(f(2, 18, 3) * f(18, 40, 2)) print(f(2, 18, 4) * f(18, 40, 1)) print(f(2, 18, 5) * f(18, 40, 0)) Сначала подумал использовать оба вызова функции с параметром counter = 0, потом понял, что будет допущено 10 использований команды 1. Потом всё-таки сделал допустимое количество использований этих команд = 5, перебрал разные варианты (чтобы от 2 до 18 не использовалась, а от 18 до 40 использовалась 5 раз или меньше и т.д. (команды print)), но ничего путёвого не вышло. Прошу помощи!
| |
|
Ответов - 1
[только новые]
|
|
|
Отправлено: 21.01.24 17:43. Заголовок: Вот более компактный..
Вот более компактный код f=lambda n,k,tr: f(n+1,k+1,tr+[n]) + f(n+3,k,tr+[n]) + f(n*2,k,tr+[n]) if n<40 and k<=5 else n==40 and k<=5 and 18 in tr and 11 not in tr and 35 not in tr print(f(2,0,[])) В вашем коде считаются случаи, которые имеют ровно 5 команд +1, а надо не более 5. И выход из рекурсии неверен - не проверили, что счетчик числа команд +1 стал равным 5. Вот ваш поправленный код: def f(start, finish, counter): if start > finish or start == 11 or start == 35 or counter > 5: return 0 if start == finish : return counter == 5 if start < finish: return f(start + 1, finish, counter + 1) + f(start + 3, finish, counter) + f(start * 2, finish, counter) print(f(2, 18, 0) * f(18, 40, 5)) print(f(2, 18, 1) * f(18, 40, 4)) print(f(2, 18, 2) * f(18, 40, 3)) print(f(2, 18, 3) * f(18, 40, 2)) print(f(2, 18, 4) * f(18, 40, 1)) print(f(2, 18, 5) * f(18, 40, 0)) print(f(2, 18, 1) * f(18, 40, 5)) print(f(2, 18, 2) * f(18, 40, 4)) print(f(2, 18, 3) * f(18, 40, 3)) print(f(2, 18, 4) * f(18, 40, 2)) print(f(2, 18, 5) * f(18, 40, 1)) print(f(2, 18, 2) * f(18, 40, 5)) print(f(2, 18, 3) * f(18, 40, 4)) print(f(2, 18, 4) * f(18, 40, 3)) print(f(2, 18, 5) * f(18, 40, 2)) print(f(2, 18, 3) * f(18, 40, 5)) print(f(2, 18, 4) * f(18, 40, 4)) print(f(2, 18, 5) * f(18, 40, 3)) print(f(2, 18, 4) * f(18, 40, 5)) print(f(2, 18, 5) * f(18, 40, 4)) print(f(2, 18, 5) * f(18, 40, 5)) последний блок можно сделать более компактным kol=0 for n in range(6): for k in range(6): kol+=f(2, 18, k+n) * f(18, 40, 5-k) print(kol)
| |
|
|