Найти - Пользователи
Полная версия: Являеться ли последовательность геометрической прогрессией?
Начало » Python для новичков » Являеться ли последовательность геометрической прогрессией?
1 2 3 4 5
FishHook
Budulianin
FishHookНу вот, взял всё испортил.
Извини, я не специально
Denis_Yakovenko
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. Я прав или нет? Правильно ли использовал то, что ты мне написал?
Budulianin
Denis_Yakovenko
код FishHook'а не работает
Торопился видать :)

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

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

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

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

На самом деле, тебе просто нужно понять, что такое прогрессия, порешать задачки. Потом уже поймёшь, что нужно писать
Denis_Yakovenko
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?
Budulianin
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')
py.user.next
#!/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
удалил исключения
Budulianin
py.user.next

py.user.next
у FishHook'а первая выдаёт ошибку с индексом, а вторая вообще истину на
Да он и не проверял наверно, главное идею видно.
py.user.next
[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 в циклах, удалил исключения)
FishHook
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
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB