2016-06-12 4 views
1

Рассмотрите проблему: задайте массив целых чисел, возвращая количество раз, в которое уменьшается массив. Таким образом, [3,2,1] уменьшается вдвое (при 3 и 2); [1,2,3,4,5,4,3,2,1] уменьшается в 4 раза (на 5, 4, 3, 2), а [1] никого не уменьшает.Метод функционального программирования или большинство методов Pythonic для циклического преобразования массива с использованием двух смежных переменных за один раз

Это очень легко решить эту проблему в цикле на любом языке:

int result = 0; 
for (int i = 0; i < array.length - 1; i++) { 
    if (array[i] > array[i+1]) result += 1; 
} 

Я только знаю, как решить эту проблему с помощью для или во время цикла и отслеживании индекса. Я не знаю никакого функционального способа, используя метод, например map, или используя списки или понимание, но я хотел бы надеяться.

+0

"без использования цикла for или while или отслеживания индекса или использования функциональных методов панели инструментов, таких как карта или фильтры или понимание". - Я не знаю, что ты ищешь. Больше ничего не осталось. –

+0

@ KarolyHorvath извините, моя грамматика была неоднозначной. Это выяснено. – djechlin

ответ

6

Один хороший способ сделать это с помощью метода zip в сочетании с sum:

sum(a > b for a, b in zip(array, array[1:])) 
0

Я не знаю, если питон массивы имеют свертка функции, но если они есть, вы могли бы сделать что-то, что в javascript будет сделано следующим образом:

let result = 0; 
[1,2,3,4,5,4,3,2,1].reduce((prev,current) => { 
    if (prev > current){ 
     result = result + 1;; 
    } 
    return current; 
}); 

console.log(result); // 4 for the given array 
0

Здесь это как рекурсивная функция.

def decreasing(xs): 
    if len(xs) < 2: 
     return 0 
    (x0, x1, *xss) = xs 
    if x0 > x1: 
     return 1 + decreasing([x1] + xss) 
    return decreasing([x1] + xss) 

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