На этом форуме отвечают на конкретные вопросы. Фраза «я не понимаю, как решать» — это не вопрос. На вопрос «как решить задачу №X» вас отошлют к материалам сайта kpolyakov.spb.ru. За бессвязный поток слов и неспособность формулировать свои мысли — бан.

Если у вас не сходится ответ на какую-то задачу, пожалуйста сразу представляйте свое «правильное» решение.
Программы "заворачивайте" в тэг [pre2]...[/pre2], при этом сохраняются все отступы и применяется моноширинный шрифт. Если у вас используется сочетание "[i]" для обозначения элемента массива или строки, ставьте пробел после открывающей скобки. Иначе система выделит все дальнейшее курсивом.

Для регистрации на форуме щелкните по ссылке «Вход-регистрация» вверху страницы. В открывшееся окошко «ник» введите свою фамилию на русском языке (например, Иванов). В окошко «пароль» введите придуманный вами пароль, состоящий из латинских букв и цифр. Поставьте галочку в окошке «зарегистрироваться, я новый участник» и нажмите кнопку «ОК».

АвторСообщение



Не зарегистрирован
ссылка на сообщение  Отправлено: 26.02.21 17:46. Заголовок: Задание №3694


Что не так с нижеизложенным кодом программы, а именно:
Во первых, при запуске в Turbo Pascal выдаёт ошибку по переполнению стека.
Во вторых, при запуске в онлайн IDE выдаёт минимальное значение n=7, т.е. F(7) = 16381.
 
Program zadanie_3694;
var Ch: integer;
S: string;
Function F(n : integer) : integer;
begin
if n <= 5 then
F := n
else
if n mod 3 = 0 then
F := n + F(n div 3 + 1)
else
F := n + F(n + 3)
end;
begin
Ch := 0;
repeat
Ch := Ch + 1;
Str(Ch, S);
writeln('F('+S+') = ', F(Ch));
until F(Ch) > 1000;
end.


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 10 [только новые]


Администратор




Сообщение: 2511
ссылка на сообщение  Отправлено: 27.02.21 10:37. Заголовок: У вас в некоторых сл..


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

___________________________________________________
Имей мужество пользоваться собственным умом. (И. Кант)
Спасибо: 1 
ПрофильЦитата Ответить



Сообщение: 1
ссылка на сообщение  Отправлено: 27.02.21 19:35. Заголовок: Пробовал использоват..


Пробовал использовать обработку исключений по переполнению стека, положительного результата не дало.

В первом сообщении я уже писал о том, что запускал в онлайн компиляторе online pascal compiler. Вот скринкаст процесса выполнения программы, без ошибок по переполнению стека:


Тогда возникают вопросы:
1. В этом случае минимальное значение n = 7, для которого F(n)>1000?
2. Или как вариант, что данный компилятор игнорирует переполнение стека и ограничивается определённым количеством цикла, но тогда, как определить зацикливание, какое количество циклов считать перебором?

Спасибо за внимание.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Сообщение: 2513
ссылка на сообщение  Отправлено: 27.02.21 21:59. Заголовок: Вероятно, в той сред..


Вероятно, в той среде двухбайтное представление целых чисел, так что после превышения порога в 32767 получается отрицательное число и рекурсия заканчивается, на успев вызвать переполнение стека.
 цитата:
n = 7, для которого F(n)>1000?

Нет, это не так. Там ответ 852.
 цитата:
как определить зацикливание, какое количество циклов считать перебором

Думаю, что 100 достаточно. Вот пример решения на Питоне, где в заголовок функции добавлен еще один параметр - вложенность вызовов. При превышении допустимого числа вызовов возвращается условное значение None и происходит выход из функции.
 def F(n, nest = 0): 
if nest > 100: return None
if n <= 5: return 1
if n % 3 == 0:
f1 = F(n//3 + 1, nest + 1)
return n + f1 if f1 else None
else:
f1 = F(n+6, nest + 1)
return n + f1 if f1 else None

n = 1
while True:
r = F(n)
if r != None and r > 1000:
print(n, r)
break
n += 1


___________________________________________________
Имей мужество пользоваться собственным умом. (И. Кант)
Спасибо: 1 
ПрофильЦитата Ответить



Сообщение: 5
ссылка на сообщение  Отправлено: 28.02.21 21:37. Заголовок: Здравствуйте! Напиши..


Спасибо!

Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 8
ссылка на сообщение  Отправлено: 24.03.21 16:59. Заголовок: Решение на паскале


Константин Юрьевич, а можно пояснить с этой задачей на паскале?

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Сообщение: 2617
ссылка на сообщение  Отправлено: 24.03.21 17:17. Заголовок: tnrom пишет: а можно..


tnrom пишет:
 цитата:
а можно пояснить с этой задачей на паскале?

Конкретные вопросы задавайте, пожалуйста. Мне кажется, что идея на поверхности - считаем, сколько раз вызвали функцию (через счетчик-параметр), если слишком много - бесконечная рекурсия, возвращаем условное значение, например, -999.

___________________________________________________
Имей мужество пользоваться собственным умом. (И. Кант)
Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
ссылка на сообщение  Отправлено: 05.10.21 13:44. Заголовок: НОМЕР 3695 def ..


НОМЕР 3695
     def F(n): 
if n < 6:
return n
elif n > 5 and n % 3 == 0:
return n + F(n/3 + 2)
else:
return 0
for i in range(3, 800, 3):
f = F(i)
if f != 0:
if f > 1000:
print(i, f)


Консоль:
705 1023.0 - минимальное значение
732 1114.0 - ответ на сайте
750 1002.0
759 1101.0
768 1026.0
777 1038.0
786 1140.0
795 1062.0

Почему 705 - не верно?

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 493
ссылка на сообщение  Отправлено: 21.10.21 12:59. Заголовок: return 0 считаю очен..


return 0 считаю очень плохой идеей
Попробуйте использовать try ... except

def F(n): 
if n < 6:
return n
elif n > 5 and n % 3 == 0:
return n + F(n/3 + 2)
else:
return n + F(n+3)

for i in range(3, 800, 3):
try:
f = F(i)
if f > 1000:
print(i, f)
except:
pass


Discussio mater veritas est Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 1
ссылка на сообщение  Отправлено: 14.01.22 06:17. Заголовок: 16 задание


(№ 3821) Алгоритм вычисления значения функции F(n), где n – целое число, задан следующими соотношениями:
F(n) = 1, при n < 2,
F(n) = F(n/3) - 1, когда n ≥ 2 и делится на 3,
F(n) = F(n - 1) + 17, когда n ≥ 2 и не делится на 3.
Назовите минимальное значение n, для которого F(n) равно 110.
Не могу понять где ошибка, я пробовала решать другое 16 задание также у меня получилось.
def f(n):
if n < 2:
return 1
if n >= 2 and 3 == 0:
return f(n // 3) - 1
else:
return f(n - 1) + 17


for i in range(1000):
if f(i) == 110:
print(i)

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 18
ссылка на сообщение  Отправлено: 14.01.22 08:19. Заголовок: Проверяйте свой код,..


Проверяйте свой код, Ульяна .
 
def f(n):
if n < 2:
return 1
if n >= 2 and n % 3 == 0:
return f(n // 3) - 1
return f(n - 1) + 17


for i in range(100000):
if f(i) == 110:
print(i)
break


Спасибо: 1 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 1832
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет