2016-06-12 10 views
1

Betrachten Sie das Problem: Angesichts einer Reihe von ganzen Zahlen, die Anzahl der Zeiten, bei denen das Array abnimmt. So [3,2,1] nimmt zweimal ab (bei 3 und 2); [1,2,3,4,5,4,3,2,1] nimmt 4 Mal ab (bei 5, 4, 3, 2), und [1] nimmt keine ab.Funktionelle Programmiermethode, oder die meisten Pythonic Weg, über ein Array mit zwei benachbarten Variablen zu einer Zeit Schleife

Es ist extrem einfach, dies für Schleife in jeder Sprache in einem lösen:

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

Ich weiß nur, wie dies eine für oder while-Schleife und die Verfolgung des Index mit zu lösen. Ich kenne keinen funktionalen Weg mit einer Methode wie map oder mit Listen oder Comprehensions, aber das ist, was ich gerne hoffen würde existiert.

+0

"ohne Verwendung einer For- oder While-Schleife oder Verfolgung des Indexes oder Verwendung funktionaler Toolbox-Methoden wie Map oder Filter oder Comprehensions." - Ich weiß nicht, wonach du suchst. Es ist nichts mehr übrig. –

+0

@KarolyHorvath Entschuldigung, meine Grammatik war mehrdeutig. Es ist geklärt. – djechlin

Antwort

6

Eine schöne Möglichkeit, dies zu tun, die zip Verfahren in Kombination verwendet mit sum:

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

Ich weiß nicht, ob Python-Arrays eine Funktion reduzieren, aber wenn sie haben, könnten Sie etwas tun, das in Javascript würde auf diese Weise erfolgen:

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

Hier ist es als eine rekursive Funktion.

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) 

Ich bin nicht sicher, dass das Erstellen mehrerer Listen wie dies in Python ist aber gesund.