Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 17, 2010 06:41:21

laf17c0dx
От:
Зарегистрирован: 2010-09-17
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужна помощь по задачке - вычислить глубину математического выражения

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

Условие задачи:
Написать функцию, вычисляющую “глубину” математического выражения.
Например:

•depth('x') => 0
•depth(('expt', ‘x’, 2)) => 1
•depth(('+', ('expt', ‘x’, 2), ('expt', ‘y’, 2))) => 2
•depth(('/', ('expt', ‘x’, 5), ('expt', ('-', ('expt', ‘x’, 2), 1), ('/', 5, 2)))) => 4

Само выражение задано списком, как единственный аргумент функции.

Набросок решения:
Додумался набросать рекурсию. Ноль возвращает, если элемент – не список. Прибавляет 1 и вызывает саму себя, если элемент – список.

# Problem 2.2: Expression depth
def depth(expr):
#how to apply the function to all list members?
if not isinstance(expr, (list, tuple)):
return 0
if isinstance(expr, (list, tuple)):
return 1 + depth(expr)
#raise NotImplementedError
Проблема:
Проверяется только первый элемент списка. Нужно как-то пройтись по всем элементам, для каждого вложенного списка накапливая значение глубины выражения. Препод предложил использовать функции map() и max().



Офлайн

#2 Сен. 17, 2010 10:33:16

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужна помощь по задачке - вычислить глубину математического выражения

def depth(expr, count=0):
if not isinstance(expr, (list, tuple)):
return count
else:
return max(map(lambda x: depth(x, count + 1), expr))

if __name__ == '__main__':
print depth('x')
print depth(('expt', 'x', 2))
print depth(('+', ('expt', 'x', 2), ('expt', 'y', 2)))
print depth(('/', ('expt', 'x', 5), ('expt', ('-', ('expt', 'x', 2), 1), ('/', 5, 2))))



Отредактировано (Сен. 17, 2010 10:33:39)

Офлайн

#3 Сен. 17, 2010 17:25:49

laf17c0dx
От:
Зарегистрирован: 2010-09-17
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужна помощь по задачке - вычислить глубину математического выражения

Согласен, но только нужно, чтобы depth(expr) только сам список передавался. Т.е. функция жестко задана, нельзя счетчик передавать.

UPD: Хотя нет, все можно. Важно было только, что в тестовых примерах ей передается только список.
Большое спасибо!



Отредактировано (Сен. 17, 2010 17:41:08)

Офлайн

#4 Сен. 17, 2010 19:34:54

laf17c0dx
От:
Зарегистрирован: 2010-09-17
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужна помощь по задачке - вычислить глубину математического выражения

Вопрос из интереса– как сделать то же самое с помощью reduce()?



Офлайн

#5 Сен. 17, 2010 21:12:29

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужна помощь по задачке - вычислить глубину математического выражения

else:
return reduce(lambda x, y: (x, y)[y > x], map(lambda x: depth(x, count + 1), expr))
оно вам надо?



Отредактировано (Сен. 17, 2010 21:14:07)

Офлайн

#6 Сен. 17, 2010 23:08:45

laf17c0dx
От:
Зарегистрирован: 2010-09-17
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужна помощь по задачке - вычислить глубину математического выражения

Zubchick
else:
return reduce(lambda x, y: (x, y)[y > x], map(lambda x: depth(x, count + 1), expr))
оно вам надо?
согласен, некрасиво получается

..а без count можно обойтись, если сказать depth(x) + 1 в рекурсии, и просто return 0 в базовом условии.

Спасибо!



Отредактировано (Сен. 18, 2010 07:55:11)

Офлайн

#7 Сен. 18, 2010 18:04:44

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Нужна помощь по задачке - вычислить глубину математического выражения

laf17c0dx
..а без count можно обойтись, если сказать depth(x) + 1 в рекурсии, и просто return 0 в базовом условии.
Так?
def depth(expr):
return int(isinstance(expr, (list, tuple))) and max([depth(x)+1 for x in expr])



Офлайн

#8 Сен. 18, 2010 20:13:43

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужна помощь по задачке - вычислить глубину математического выражения

Можно даже не приводить к int

Ed
def depth(expr):
return isinstance(expr, (list, tuple)) and max()



Офлайн

#9 Сен. 18, 2010 21:47:26

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Нужна помощь по задачке - вычислить глубину математического выражения

Нельзя. Тогда depth('x') вернет False, а не 0.



Офлайн

#10 Сен. 26, 2010 20:51:28

laf17c0dx
От:
Зарегистрирован: 2010-09-17
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужна помощь по задачке - вычислить глубину математического выражения

даа..в одну строчку еще более красиво и просто!)



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version