С помощью компьютерной программы определить наименьшее значение n, при
котором сумма чисел, которые будут выведены при вызове F(n), будет больше 5000000. Запишите в ответе сначала найденное значение n, а затем через пробел – соответствующую сумму
выведенных чисел.
def F( n ):
print(2*n+1)
if n > 1:
print(3*n-8)
F(n-1)
F(n-4)
Python
Помогите пожалуйста. Нужно написать рекурсивную функцию в python. Заранее благодарю!
Питон без отступов - это игра в "угадай, какой изначально был код". Учитывая, что рекурсия должна когда-то остановиться, а условие в функции только одно, предполагаю, что код был таким:
Приведённый в предыдущем ответе код содержит ошибку, печатая
Далее, далеко не всякую функцию, определённую рекурсивно, следует рекурсивно же и реализовывать. Нет никакой нужды на каждой итерации заново вычислять F от предыдущих значений. Простые прикидки показывают, что функция растёт очень быстро, как минимум как O(n³), если не экспонента, а значит, до 5 млн мы добежим на n не более нескольких сотен. Такое количество значений можно кэшировать. Вычисления следует начинать с n = -2, т.к. именно для такого минимального n вызывается функция (при n = 2 под условием n > 1 будет вызвана F(n - 4)).
Поэтому идём от меньших значений к большим и сохраняем вычисленные значения в список для каждого n, а при вычислениях достаём их из списка.
Вывод:
def F(n):
print(2*n+1)
if n > 1:
print(3*n-8)
F(n-1)
F(n-4)
Но вам рекомендую в эту рулетку не играть, а то в следующий раз угадайка не решится однозначно, и вы будете получать неверные ответы от местных "знатоков", рвущихся писать код, не разобравшись в задаче.Приведённый в предыдущем ответе код содержит ошибку, печатая
39 5185055
В то время, как сумма чисел, выводимых исходной функцией для аргумента 39, равна 4920675
Поэтому n = 39 не является решением задачи. Это значение - только лишь "где-то рядом". Произошло это потому, что автор ответа произвольно изменил логику функции, добавив условие, которого не было в исходном варианте.Далее, далеко не всякую функцию, определённую рекурсивно, следует рекурсивно же и реализовывать. Нет никакой нужды на каждой итерации заново вычислять F от предыдущих значений. Простые прикидки показывают, что функция растёт очень быстро, как минимум как O(n³), если не экспонента, а значит, до 5 млн мы добежим на n не более нескольких сотен. Такое количество значений можно кэшировать. Вычисления следует начинать с n = -2, т.к. именно для такого минимального n вызывается функция (при n = 2 под условием n > 1 будет вызвана F(n - 4)).
Поэтому идём от меньших значений к большим и сохраняем вычисленные значения в список для каждого n, а при вычислениях достаём их из списка.
from itertools import count
CF = []
def F(n):
s = 2 * n + 1
if n > 1:
s += 3 * n - 8 + CF[n - 1 + 2] + CF[n - 4 + 2]
return s
for n in count(-2):
sum = F(n)
if sum >= 5000000: break
CF.append(sum)
print(n, sum)
Получился алгоритм линейной сложности вместо квадратичной или кубической, которая была у рекурсивной версии, и главное - он не упадёт с переполнением стека, если вам понадобится считать для n > 1000 (впрочем, на n > 1000 количество цифр суммы не поместится на строчке вашего экрана).Вывод:
40 6791973
itertools.count нужен для организации бесконечного цикла со счётчиком итераций. Остальное в коде - самоочевидно.def F(n):
if n <= 0:
return 0
else:
s = 2*n + 1
if n > 1:
s += 3*n - 8
return s + F(n-1) + F(n-4)
n = 0
sum = 0
while sum <= 5000000:
n += 1
sum = F(n)
print(n, sum)
Эта функция использует рекурсию для вычисления суммы чисел, которые будут выведены при вызове F(n). Затем она находит наименьшее значение n, при котором сумма чисел больше 5000000.
В результате выполнения функции будет выведено два значения через пробел: значение n, при котором сумма чисел больше 5000000, и соответствующую этому значению сумму выведенных чисел.
if n <= 0:
return 0
else:
s = 2*n + 1
if n > 1:
s += 3*n - 8
return s + F(n-1) + F(n-4)
n = 0
sum = 0
while sum <= 5000000:
n += 1
sum = F(n)
print(n, sum)
Эта функция использует рекурсию для вычисления суммы чисел, которые будут выведены при вызове F(n). Затем она находит наименьшее значение n, при котором сумма чисел больше 5000000.
В результате выполнения функции будет выведено два значения через пробел: значение n, при котором сумма чисел больше 5000000, и соответствующую этому значению сумму выведенных чисел.
random_number = random.randint(1, 5)
user_number = int(input("Угадай число (от 1 до 1): "))
if user_number == random_number:
print("Ты выиграл!")
print("good work!")
else:
print("Ты проиграл!")
print(f"было загадано число {random_number}")
print("YOU NOOB!")
print("Ты дебил")
print("ты лоХ")
print("Соси у совы?")
user_number = int(input("Угадай число (от 1 до 1): "))
if user_number == random_number:
print("Ты выиграл!")
print("good work!")
else:
print("Ты проиграл!")
print(f"было загадано число {random_number}")
print("YOU NOOB!")
print("Ты дебил")
print("ты лоХ")
print("Соси у совы?")
Похожие вопросы
- Помогите пожалуйста решить задачу "Ход конём" в Python.
- Помогите пожалуйста сделать задание в Яндекс.практикум Python. Завис на задании.
- Написать функцию. Помогите пожалуйста!
- Помогите, пожалуйста, решить задачу Python
- Можно ли такое написать на компьютерном языке PYTHON
- Помогите пожалуйста написать скрипт на языке Python 3
- Написать код, прошу помогите пожалуйста на python
- Помогите пожалуйста составить программу на языке Python. заранее спасибо!
- Помогите пожалуйста написать 2 программы на Python
- Помогите, как сделать авторизацию в программе на python?