Gehen Sie mit dem Debugger durch Ihren Code, stoppen Sie bei interessanten Zeilen und untersuchen Sie die Werte. Sie sollten in der Lage sein, das Problem bald genug zu finden.
Wenn Sie eine for
Schleife verwenden mögen, können Sie Ihren Code, und lassen Sie das spezielle Gehäuse für 0 und 1, während der Festsetzung der Oberseite der Schleifenbedingung vereinfachen:
function isIncreasing(xs) {
var prev, cur;
for (var i = 0; i < xs.length; i++) {
cur = xs[i];
if (i && cur !== prev && cur !== prev + 1) return false;
prev = cur;
}
return true;
}
Wenn Sie erlaubt sind ES5 Array Methoden zu verwenden, kann dies nutzen every
:
[1, 2, 3].every(function(elt, idx, arr) {
var prev = arr[idx - 1];
return !idx || elt === prev || elt === prev + 1;
})
Wenn Sie Ihren Code semantischen und lesbar machen, eine gut benannte Funktion definieren:
function sameOrGreater(elt, idx, arr) {
var prev = arr[idx - 1];
return !idx || elt === prev || elt === prev + 1;
}
[1, 2, 3].every(sameOrGreater)
Um mit dieser Faktorisierung fortzufahren, können wir zwei Aspekte der Lösung trennen. Die erste besteht darin, zu sehen, ob ein Wert gleich oder größer als der andere ist. Die zweite besteht darin, Paare benachbarter Elemente in einem Array aufzunehmen.Mit anderen Worten, würden wir die Lösung, wie in der Lage sein mag
pairs(xs).every(sameOrGreater)
sameOrGreater
ist einfach zu schreiben:
function sameOrGreater(x, y) { return x === y || x === y - 1; }
pairs
wie folgt geschrieben werden kann:
function pairs(array) {
return array.slice(1).map(function(elt, idx, arr) {
return [array[idx], elt];
});
}
> pairs([1, 2, 3])
< [[1, 2], [2, 3]]
Sie bevorzugen könnten zu schreiben pairs
mit einem Generator:
function* pairs(array) {
let prev;
for (const x of array) {
yield [prev, x];
prev = x;
}
}
Alternativ könnten wir eine Version von map
schreiben, die eine Funktion, auf die fed Paare nimmt, wie folgt:
function mapPairs(xs, fn) {
var result = [];
for (var i = 1; i < xs.length); i++) {
result.push(fn(x[i - 1], x[i]));
}
return result;
}
Jetzt können wir das ganze Problem als
mapPairs(xs, sameOrGreater).every(Boolean)
Nein, der ursprüngliche Code schreiben tatsächlich das letzte Element und ein Extra nach dem letzten; es wird als "i <= xs.length - 1" angegeben, sollte aber "i
@ KenY-N: rechts-o, bearbeitet – georg
Oh ja natürlich! Dummer kleiner Fehler, der Code funktioniert jetzt Danke! – RandomStacker