Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 21, 2013 20:48:25

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Являеться ли последовательность геометрической прогрессией?

Budulianin
FishHookНу вот, взял всё испортил.
Извини, я не специально



Офлайн

#2 Окт. 21, 2013 20:57:33

Denis_Yakovenko
Зарегистрирован: 2013-09-28
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Являеться ли последовательность геометрической прогрессией?

Budulianin
код FishHook'а не работает, и это не то, что мне нужно. Я буду очень благодарен, если Вы еще пару раз попробуете натолкнуть меня на решение, чтобы я сам понял, что написал.
Итак, вот, до чего я пока что дошел:

def gprogrestion(lst):
    from math import sqrt
    if lst == []:
        return []
    else:
        if abs(lst[n]) == sqrt(lst[n-1]*lst[n+1]):
            return True
        else:
            return False

Насколько мне кажется, осталось лишь одно - каким-то образов определить n. Я прав или нет? Правильно ли использовал то, что ты мне написал?

Офлайн

#3 Окт. 21, 2013 20:59:09

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Являеться ли последовательность геометрической прогрессией?

Denis_Yakovenko
код FishHook'а не работает
Торопился видать :)

Denis_Yakovenko
Насколько мне кажется, осталось лишь одно - каким-то образов определить n
По разному можно решить эту задачу

Например в первом варианте, FishHook вычисляет знаменатель прогрессии и вычисляя каждый член, сравнивает его с элементом списка

Я предлагал тебе просто воспользоваться равенством, проверяя его для каждого члена, если равенство выполняется, для каждого члена, то это прогрессия.



Отредактировано Budulianin (Окт. 21, 2013 21:05:57)

Офлайн

#4 Окт. 21, 2013 21:04:05

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Являеться ли последовательность геометрической прогрессией?

Denis_Yakovenko
Я прав или нет?
Нет

Нужно проверять каждый член прогрессии, неизвестно, что там вообще в списке(если по хорошему) :)

На самом деле, тебе просто нужно понять, что такое прогрессия, порешать задачки. Потом уже поймёшь, что нужно писать



Отредактировано Budulianin (Окт. 21, 2013 21:09:01)

Офлайн

#5 Окт. 21, 2013 21:09:30

Denis_Yakovenko
Зарегистрирован: 2013-09-28
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Являеться ли последовательность геометрической прогрессией?

Budulianin

def gprogrestion(lst):
    from math import sqrt
    if lst == []:
        return ('Empty list')
    else:
        for x in lst:
            if abs(lst[x]) == sqrt(lst[x-1]*lst[x+1]):
                return True
            else:
                return False

Сейчас получился такой код. Но он работает только для списков, с количеством элементов, большим 3.
Но ведь нужно, чтобы работало и для двух и трёх элементов. это исправимо, ведь? Возможно, нужно добавить ветку elif?

Отредактировано Denis_Yakovenko (Окт. 21, 2013 21:10:30)

Офлайн

#6 Окт. 21, 2013 21:51:58

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Являеться ли последовательность геометрической прогрессией?

def check_prog(lst):
    if len(lst) >= 3 and lst[1] != 0:
        for i in xrange(1, len(lst)-1):
            if not pow(lst[i-1] * lst[i+1], 0.5) == abs(lst[i]):
                return False
        return True
                
    elif len(lst) == 2 and all(lst):
        return True
        
if check_prog([1, 2, 4, 8]):
    print('this is a geometric progression')
else:
    print('this is not a geometric progression')



Отредактировано Budulianin (Окт. 21, 2013 21:54:26)

Офлайн

#7 Окт. 21, 2013 23:04:03

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

Являеться ли последовательность геометрической прогрессией?

#!/usr/bin/env python3
 
def isgeompro(lst):
    """Test whether the list is a geometric progression."""
    if not (len(lst) >= 2 and lst[0] and lst[1]):
        return False
    q = lst[1] / lst[0]
    p = lst[1]
    for e in lst[2:]:
        # в p - элемент геом. прогрессии с коэфф. q
        if e / p == q:
            p = e
        else:
            return False
    return True

версия с itertools.islice()

#!/usr/bin/env python3
 
from itertools import islice
 
def isgeompro(lst):
    """Test whether the list is a geometric progression."""
    if not (len(lst) >= 2 and lst[0] and lst[1]):
        return False
    q = lst[1] / lst[0]
    p = lst[1]
    for e in islice(lst, 2, None):
        # в p - элемент геом. прогрессии с коэфф. q
        if e / p == q:
            p = e
        else:
            return False
    return True

Budulianin'скую проверил
по скорости с Budulianin'ской не сравнивал

а у Denis_Yakovenko в обоих вариантах постоянно баги вылезают, то с индексами, то с другими подобными вещами

у FishHook'а первая выдаёт ошибку с индексом, а вторая вообще истину на
[1, 2, 3]

add
добавил версию с itertools.islice()

add
удалил сохранение q в цикле

add
удалил исключения



Отредактировано py.user.next (Окт. 22, 2013 21:49:23)

Офлайн

#8 Окт. 21, 2013 23:19:36

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Являеться ли последовательность геометрической прогрессией?

py.user.next

py.user.next
у FishHook'а первая выдаёт ошибку с индексом, а вторая вообще истину на
Да он и не проверял наверно, главное идею видно.



Отредактировано Budulianin (Окт. 21, 2013 23:19:56)

Офлайн

#9 Окт. 22, 2013 00:57:19

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

Являеться ли последовательность геометрической прогрессией?

[guest@localhost timecmp]$ ./timecmp.py 
[1.0042134939999414, 1.025258840999868, 1.007287111000096]
[0.9715859099999307, 0.9866435950000323, 0.9697419239998908]
[0.9852825709999706, 0.988240076000011, 1.010458663999998]
[guest@localhost timecmp]$

1 -
lst[2:]
2 -
islice(lst, 2, None)
3 - Budulianin'ская

в общем, не очень отличаются; можно сказать, эквивалентные
где-то Budulianin'ская быстрее, но там и исключений нет
но хотя бы в два раза нигде не различаются

add
обновил временные замеры
(удалил сохранение q в циклах, удалил исключения)



Отредактировано py.user.next (Окт. 22, 2013 21:50:23)

Офлайн

#10 Окт. 22, 2013 11:04:05

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Являеться ли последовательность геометрической прогрессией?

py.user.next
а вторая вообще истину на
fixed
lst = [2, 4]
if len(lst) < 2:
    raise ValueError("len < 2")
l = lst[-1::-1]
s = map(lambda x: float(x[0])/x[1], zip(*[iter(l)]*2))
if len(lst) % 2:
    s.append(lst[0])
print len(set(s)) == 1



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version