Impostazione di un ciclo ricorsivo in jslCIAO,
Ho creato uno script lungo in cui l'adattamento di una curva viene eseguito in modo iterativo su una tabella di dati di grandi dimensioni in cui molte variabili sono elencate in 1 colonna. Tuttavia alla fine del processo alcune di queste variabili non vengono adattate (il processo è fallito per un motivo o per l'altro). A questo punto, creo un elenco di 'adattamento non riuscito' delle variabili che non erano state adattate nel precedente e creo un sottoinsieme dalla tabella di origine (seleziona dove/contiene/sottoinsieme) ed eseguo nuovamente parte dello script iniziale (quella porzione di lo script è racchiuso in un'espressione) nella tabella del sottoinsieme (righe selezionate, tutte le colonne).
Alla fine del secondo ciclo di adattamento, viene creato un nuovo elenco di "adattamento non riuscito" (in genere più piccolo).
Sto cercando di trovare un modo per creare un ciclo ricorsivo in cui il codice cerchi la dimensione dell'ultimo elenco di "adattamento non riuscito" e se è maggiore di 0 e diverso dal precedente elenco di "adattamento non riuscito", verrà avviato un altro ciclo di adattamento fino a quando 'adattamento non riuscito' = 0 o è identico all'elenco precedente di 'adattamento non riuscito' (per evitare di creare un ciclo infinito).
Ogni suggerimento sarà molto apprezzato.
Sebastiano
Combinazione e pulizia dei datiPersonalizzazione di massafinestreRe: Impostazione di un ciclo ricorsivo in jsl@Craige_Hales Grazie mille per il suggerimento. Proverò questa strategia.
Sebastiano
Re: Impostazione di un ciclo ricorsivo in jslNon userei la ricorsione per questo. Utilizzare un elenco di WorkToBeDone e un elenco di WorkCompleted e un flag FoundSomething. Scrivi il tuo loop in questo modo:
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
);Re: Impostazione di un ciclo ricorsivo in jslCiao @jthi ,
Grazie per il tuo contributo originale. Sfortunatamente, non sono riuscito a trasformare il tuo suggerimento in uno script praticabile.
Quindi allego un'altra descrizione del mio obiettivo (non uno script di funzioni ma piuttosto un "flusso di lavoro").
Spero che qualcuno possa indicarmi la giusta direzione.
Grazie
Sebastiano
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);
Re: Impostazione di un ciclo ricorsivo in jslCiao @jthi ,
grazie per il consiglio. Ci proverò
Sebastiano
Re: Impostazione di un ciclo ricorsivo in jslJMP fornisce la ricorsione con Recurse(). Penso che tu possa anche richiamare nuovamente la stessa funzione per renderla ricorsiva
Utilizzando ricorsione():
Names Default To Here(1);
ex rev = Function({s},
If(Length(s) <= 1,
s,
Recurse(Substr(s, 2)) || Left(s, 1)
)
);
ex rev("abcd");
Chiamando la stessa funzione:
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");