Ich glaube nicht, dass Sie zu viele Wachen eingesetzt haben. Es gibt zwei Fälle:
Der erste ist der explizite Gleichheitstest in der ersten Klausel von create/2
create(N, M) when N =:= M -> [M];
Einige haben vorgeschlagen, dies umzuwandeln, um Mustervergleiche zu verwenden wie
create(N, N) -> [N];
In diesem Fall macht es keinen Unterschied, da der Compiler die Version mit Mustervergleich intern in das umwandelt, was Sie geschrieben haben. Sie können ohne Bedenken die Version wählen, die Sie in jedem Fall für die beste halten.
Im zweiten Fall brauchen Sie eine Art von Sicherheitsprüfung, dass der Wert des Arguments in dem Bereich liegt, den Sie erwarten. Doing in jeder Schleife ist unnötig und ich würde es zu einem gleichwertigen Test in create/1 verschieben:
create(M) when M > 1 -> create(1, M).
Wenn Sie einen Akkumulator verwenden möchten, würde ich persönlich die Zählversion verwenden, da sie das Umkehren der Liste am Ende erspart. Wenn die Liste nicht lang ist, denke ich, dass der Unterschied sehr gering ist und Sie die Version wählen können, die Ihnen am klarsten erscheint. Auf jeden Fall ist es sehr einfach, dies später zu ändern, wenn Sie es für kritisch halten.