Einrichten einer rekursiven Schleife in jslHi,
Ich habe ein langes Skript erstellt, in dem eine Kurvenanpassung iterativ für eine große Datentabelle durchgeführt wird welche vielen Variablen in einer Spalte aufgeführt sind. Am Ende des Prozesses sind jedoch einige dieser Variablen nicht angepasst (der Prozess ist aus dem einen oder anderen Grund fehlgeschlagen). An diesem Punkt erstelle ich eine Liste mit fehlgeschlagenen Anpassungen der Variablen, die in der vorherigen Tabelle nicht angepasst wurden, erstelle eine Teilmenge aus der Quelltabelle (wählen Sie where/contains/subset aus) und führe einen Teil des ursprünglichen Skripts erneut aus (diesen Teil von (das Skript ist in einen Ausdruck eingeschlossen) für die Teilmengentabelle (ausgewählte Zeilen, alle Spalten).
Am Ende der zweiten Anpassungsrunde wird eine neue Liste „fehlgeschlagener Anpassung“ erstellt (normalerweise kleiner).
Ich versuche, eine Möglichkeit zu finden, eine rekursive Schleife zu erstellen, in der der Code nach der Größe der letzten Liste mit „fehlgeschlagenen Anpassungen“ sucht und diese initiiert, wenn sie größer als 0 ist und sich von der vorherigen Liste mit „fehlgeschlagenen Anpassungen“ unterscheidet Eine weitere Anpassungsrunde, bis „Anpassung fehlgeschlagen“ = 0 oder mit der vorherigen Liste „Anpassung fehlgeschlagen“ identisch ist (um die Entstehung einer Endlosschleife zu vermeiden).
Für Vorschläge wäre ich sehr dankbar.
Sebastian
Datenmischung und -bereinigungMassenanpassungWindowsBetreff: Einrichten einer rekursiven Schleife in jsl@Craige_Hales Vielen Dank für den Vorschlag. Ich werde diese Strategie ausprobieren.
Sebastian
Betreff: Einrichten einer rekursiven Schleife in jslIch würde dafür keine Rekursion verwenden. Verwenden Sie eine Liste von WorkToBeDone und eine Liste von WorkCompleted sowie ein Flag FoundSomething. Schreiben Sie Ihre Schleife etwa so:
good = function({ method, item),
// use the current strategy/method to test the item
// return 1 if pass, 0 if fail
);
FoundSomething = 1; // flag: are we still making progress?
strategy = 1; // maybe change the strategy after each round
while(FoundSomething,
FoundSomething = 0;
for(i = nitems(WorkToBeDone), i>=1, i -= 1, // backwards because removing items
if( good( strategy, WorkToBeDone[i] ),
insertinto(WorkCompleted, removefrom(WorkToBeDone,i));
FoundSomething = 1;
)
);
strategy += 1; // new strategy for next round
);Betreff: Einrichten einer rekursiven Schleife in jslHallo @jthi ,
Vielen Dank für Ihren ursprünglichen Beitrag. Leider ist es mir nicht gelungen, Ihren Vorschlag in ein praktikables Skript umzusetzen.
Daher füge ich eine weitere Beschreibung meines Ziels bei (kein Funktionsskript, sondern ein „Workflow“).
Hoffentlich kann mir jemand den richtigen Weg weisen.
Danke
Sebastian
names default to here(1);
clear log();
sourcefitting={"a","b","c","d","e","f"};
/*The sourcefitting list can be 1000s longs and split in batches to perform some curve fitting, parameter extraction and them summarization using a FOR loo into a master table.
The process is expected to fail on some of those batches.
The failed items are identifed/listed into the 'failedfitting" list.
At which point a recursive loop using 'processX' needs to be implemented to take care of the remaining items using a new round of batching and fitting (for some reason the 'failing' process works on smaller batches but predicting which one will failed is not possible hence the need for a recessive loop), until the 'failedfittingX' list' is either empty or is stagnating (processfitting=1) ie the process keeps on failing and running the process another round is not longer warranted.
*/
processX=expr(/* process XYZ*/ //each time the processX is run 2 list are generated "succesfittingX" and "failedfittingX" are generated
//A new list "successfittingX" is generated at the end of the recursive loop
successfitting0={"a","c","d"};
/*
successfitting1={"a","c","d","b"};
successfitting2={"a","c","d","b","e"};
successfitting3={"a","c","d","b","e","f"}*/;// or successfitting3={"a","c","d","b","e"};
successfitting=successfittingX;
//The successfittingX and the sourcefitting lists are compared and a resulting list "failedfittingX" is created:
failedfitting0={"b","e","f"};
/*
failedfitting1={"e","f"};
failedfitting2={"f"};
failedfitting3={}*/; // or failedfitting3={"f"};
failedfitting=failedfittingX;
failednb=Nitems(failedfitting);
if(failedfittingX==failedfittingX-1,progressfitting=1, progressfitting=0);
);
//The issue is about correctly defining the structure recursive loop which uses the previous list to determine wheter the process needs to keep on going or if it is completed
// the use of the function 'recurse' has been suggested
testrec=function({failednb},
if(failednb>0&processfitting=0 ,recurse( processX),show("Done"))
);
testrec(failednb);
Betreff: Einrichten einer rekursiven Schleife in jslHallo @jthi ,
Danke für den Tipp. Ich versuche es mal
Sebastian
Betreff: Einrichten einer rekursiven Schleife in jslJMP bietet Rekursion mit Recurse(). Ich denke, Sie können dieselbe Funktion auch noch einmal abrufen, um sie rekursiv zu machen
Mit recurse():
Names Default To Here(1);
ex rev = Function({s},
If(Length(s) <= 1,
s,
Recurse(Substr(s, 2)) || Left(s, 1)
)
);
ex rev("abcd");
Aufruf derselben Funktion:
Names Default To Here(1);
ex rev = Function({s},
If(Length(s) <= 1,
s,
ex rev(Substr(s, 2)) || Left(s, 1)
)
);
ex rev("abcd");