Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Центр помощи
  • » Задача "Разворот последовательности" без применения динамических структур данных [RSS Feed]

#1 Янв. 10, 2018 08:54:28

kamikadze
Зарегистрирован: 2018-01-10
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Задача "Разворот последовательности" без применения динамических структур данных

Всем Коничива! Условие задачи:

“Дана последовательность целых чисел (вводится с клавиатуры), заканчивающаяся числом 0. Выведите эту последовательность в обратном порядке. При решении этой задачи нельзя пользоваться массивами и прочими динамическими структурами данных.Рекурсия вам поможет.”

Мое решение:

 def reverse(l):
    if len(l) > 1:
        print(l[len(l)-1])
        del l[len(l)-1]
        return reverse(l)
    else:
        return l[0]
def ss(n):
    if n != 0:
        l.append(n)
        return ss(int(input()))
    elif n == 0 and len(l) == 0:
        return n
    elif n == 0 and len(l) != 0:
        l.append(n)
        return reverse(l)
l = []
print(ss(int(input())))

Проблема:

Да, я использовал динамическую структуру. Но, мне кажется, что структура алгоритма, с помощью которого поставленную задачу возможно решить, не может не содержать динамических структур. Принцип таков: для каждого нового значения необходимо место в памяти. Количество значений заранее не предопределено. Вопрос: как в такой ситуации, можно решить задачу без динамических структур? Кстати, рылся в интернете, так и не нашел толком, что такое ч точки зрения Python динамические и (не динамические) статические структуры данных. Проверил решение на тестах сайта Питон для начинающих (не помню точно адрес), все 5 возможных тестов проходит. В принципе для меня главное решить задачу в общем, а не изощряться с типами применяемых данных. Но на Курсере есть какой-то 6 тест, который мой алгоритм не проходит. Что он проверяет я не знаю. Может, в моем алгоритме есть ошибки? На малых числах все работает исправно.

Отредактировано kamikadze (Янв. 10, 2018 09:50:17)

Офлайн

#2 Янв. 10, 2018 09:46:20

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9727
Репутация: +  843  -
Профиль   Отправить e-mail  

Задача "Разворот последовательности" без применения динамических структур данных

  
>>> def print_reversed(seq, pos=0):
...     elem = seq[pos]
...     if elem != 0:
...         print_reversed(seq, pos + 1)
...     print(elem)
... 
>>> print_reversed([1, 2, 3, 4, 5, 0])
0
5
4
3
2
1
>>>

kamikadze
Кстати, рылся в интернете, так и не нашел толком, что такое ч точки зрения Python динамические и (не динамические) статические структуры данных.
Динамическая структура данных - это такая структура данных, количество элементов которой может меняться после её создания. Примеры: стек, очередь, дек, линейный список, множество, динамический вектор. В питоне многие из этих динамических структур реализованы в виде встроенных типов: стек - list, множество - set(), нагруженное множество - dict, динамический вектор - list. При этом есть и библиотечный тип: дек - collections.deque. А вот динамической структуры последовательность в питоне не реализовано, но частично её роль выполняют итераторы, так как не все операции над последовательностью можно выполнять с итератором (нельзя добавить элемент после создания, нельзя сделать подсматривание следующего элемента без его взятия и нельзя опустошить итератор в любое время и начать заново заполнять).



Отредактировано py.user.next (Янв. 10, 2018 09:59:30)

Офлайн

#3 Янв. 10, 2018 09:49:49

kamikadze
Зарегистрирован: 2018-01-10
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Задача "Разворот последовательности" без применения динамических структур данных

py.user.next
Спасибо, конечно, но последовательность вводится с клавиатуры. Поэтому у меня и стоят операторы input().

Офлайн

#4 Янв. 10, 2018 10:02:34

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9727
Репутация: +  843  -
Профиль   Отправить e-mail  

Задача "Разворот последовательности" без применения динамических структур данных

kamikadze
но последовательность вводится с клавиатуры. Поэтому у меня и стоят операторы input().
После того, как ты ввёл последовательность, её надо подать в функцию обращения. То, что ты там трактуешь, что якобы ни одного списка быть не должно во всём коде, - это просто твои домыслы, потому что ты неправильно понял условия выполнения заданий подобного рода. Нельзя применять список внутри самой функции обращения для временного хранения элементов.



Отредактировано py.user.next (Янв. 10, 2018 10:03:06)

Офлайн

#5 Янв. 10, 2018 10:13:27

kamikadze
Зарегистрирован: 2018-01-10
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Задача "Разворот последовательности" без применения динамических структур данных

py.user.next
Согласен, что я там неправильно что-то понял или не понял. Но только то, что написано в условиях задачи, то я и читаю. А там написано: “При решении этой задачи нельзя пользоваться массивами и прочими динамическими структурами данных.” Тут не сказано, что их нельзя использовать только в пределах функций или каких-то других конкретных частях кода. Тут сказано: “в пределах задачи”. А додумывать за автора задачи никто не может, кроме него самого. ХЗ, что он там имел ввиду. Ну а то, что у вас есть опыт решения подобных задач, просто потому, что вы с этим уже сталкивались, не дает права “тыкать” остальным. А за разъяснения спасибо большое.

Офлайн

#6 Янв. 10, 2018 10:28:13

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9727
Репутация: +  843  -
Профиль   Отправить e-mail  

Задача "Разворот последовательности" без применения динамических структур данных

kamikadze
Но только то, что написано в условиях задачи, то я и читаю.

Ну вот и читай
kamikadze
Дана последовательность целых чисел (вводится с клавиатуры), заканчивающаяся числом 0.

Дана последовательность - это значит что? Это значит, что по условию задачи последовательность уже есть, а для решения задачи нужно проделать с ней действия и получить результат. Поэтому перевод строки из консоли в последовательность целых чисел не входит в задачу. Это уже дано по условию.

Ты просто делаешь
  
print_reversed(tuple(map(int, input().split())))

Можно это и на итераторе сделать, но я пока что нигде не вижу, что тесты это требуют. Разницы-то нет, так как на итераторе код самой рекурсии будет точно таким же. Цель упражнения - научить рекурсии, поэтому заморочек с памятью вообще быть не должно. А требование избегать динамических структур для того и введено, чтобы только рекурсией это решалось.



Отредактировано py.user.next (Янв. 10, 2018 10:33:36)

Офлайн

#7 Янв. 10, 2018 10:38:37

kamikadze
Зарегистрирован: 2018-01-10
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Задача "Разворот последовательности" без применения динамических структур данных

py.user.next
Блин, никогда бы не поверил, что незатейливое обсуждение логики кода может перейти в “халивар” интелектов.

Так! Понимаю и принимаю ваше недоумение и заслуженный поток возмущений. В связи с тем прикладываю скриншот лично мной склеенный с сайта с задачей, чтобы Вы воочию смогли убедиться в вопиющей несправедливости происходящего.

Прикреплённый файлы:
attachment 1.png (38,4 KБ)

Офлайн

#8 Янв. 10, 2018 11:06:50

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9727
Репутация: +  843  -
Профиль   Отправить e-mail  

Задача "Разворот последовательности" без применения динамических структур данных

Скопируй сюда точно то, что туда отправил в последний раз.



Офлайн

#9 Янв. 10, 2018 11:08:50

kamikadze
Зарегистрирован: 2018-01-10
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Задача "Разворот последовательности" без применения динамических структур данных

 def reverse(l):
    if len(l) > 1:
        print(l[len(l)-1])
        del l[len(l)-1]
        return reverse(l)
    else:
        return l[0]
def ss(n):
    if n != 0:
        l.append(n)
        return ss(int(input()))
    elif n == 0 and len(l) == 0:
        return n
    elif n == 0 and len(l) != 0:
        l.append(n)
        return reverse(l)
l = []
print(ss(int(input())))

Офлайн

#10 Янв. 10, 2018 11:39:46

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9727
Репутация: +  843  -
Профиль   Отправить e-mail  

Задача "Разворот последовательности" без применения динамических структур данных

Отправь туда

  
def print_reversed(seq, pos=0):
    elem = seq[pos]
    if elem != 0:
        print_reversed(seq, pos + 1)
    print(elem)
 
print_reversed(tuple(map(int, input().split())))



Офлайн

  • Начало
  • » Центр помощи
  • » Задача "Разворот последовательности" без применения динамических структур данных[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version