имеется возрастающая последовательность из n разных чисел. Определить минимальное число сравнений для того чтобы убедиться что не существует двух пар чисел из этой последовательности с одинаковой суммой.
Например - в последовательности [1,2,3,4] такие пары [1,4] и [2,3]
Фукнциональное решение на питоне (мне не совсем нравится. но что придумал то придумал)
def functional_approach(length):
data=filter(lambda x: x[0]<x[1],iselectmany(xrange(1,length+1),curry1(izipwith,xrange(1,length+1))))
def count(pair,li):
return len(filter(lambda x:x[0]> pair[0] and x[1]<pair[1],li))
print reduce(lambda x,y:x+count(data[y],data[y+1:]),xrange(0,len(data)))
Императивное решение:
def iter_approach(length):
data = []
for a in xrange(1,length):
for b in xrange(a+1,length+1):
data.append((a,b));
c = 0
for l in xrange(0,len(data)-1):
for n in xrange(l+1,len(data)):
if data[l][0]<data[n][0] and data[l][1]>data[n][1]:
c = c + 1
print c
Вот как хотите но по мне императивное решение проще, понятнее, интуитивние и т.д. Вообщем по всем критериям кроме краткости является лучшим решением. Ну может конечно функциональное написано коряво...не знаю.
Впомогательные фукнции-генераторы izipwith и iselectmany
def izipwith(seq,n):
for s in seq:
yield (n,s)
def iselect_many(seq,func):
for s in seq:
for s1 in func(s):
yield s1
Комментариев нет:
Отправить комментарий