2010-11-08 13 views
7

Ich verwende NestWhileList in einer Situation, in der es oft die 'maximale Anzahl von Auswertungen' trifft. Nach ein paar curios Ergebnisse zu erzielen, nahm ich einen genaueren Blick auf, wie NestWhileList reagiert spezifiziert eine maximale Anzahl von Ergebnissen zu haben:Mathematica: Grokking 'maximale Anzahl von Auswertungen' Argument für `NestWhileList`

Table[{nmax, 
    [email protected][ 
    (* f: nesting function *) Identity, 
    (* initial state *) 1, 
    (* test function *) False &, 
    (* m: of arguments for test *) 1, 
    (* nmax: max # applications of f *) nmax, 
    (* n: extra evaluations *) 1]}, {nmax, 0, 2}]; 
ToString[TableForm[%, 
    TableHeadings -> {None, {"nmax", "output length"}}]] 

Der überraschende Teil ist, dass nmax=1 wird ausgesondert: Hier f wird 2 mal angewandt, während für alle anderen Werte wird nur einmal angewendet:

nmax output length 
0  2 
1  3 
2  2 

die ‚Extra-Evaluationen‘ scheinen ein Teil des Problems zu sein. Verlassen Sie diese Option aus gibt viel vernünftige Ergebnisse:

Table[{nmax, 
    [email protected][ 
    (* f: nesting function *) Identity, 
    (* initial state *) 1, 
    (* test function *) False&, 
    (* m: of arguments for test *) 1, 
    (* max: max # applications of f *) nmax]},{nmax,0,2}]; 
ToString[TableForm[%,TableHeadings->{None, {"nmax","output length"}}]] 

Out[123]=  
    nmax output length 
    0  1 
    1  1 
    2  1 

Meine Frage: Ist das irgendwie Sinn machen, oder ist es nur ein Fehler?

Antwort

4

Es macht keinen Sinn, und ich bin ziemlich sicher, dass es nur ein Fehler ist. NestWhile ist in ähnlicher Weise betroffen:

In[53]:= NestWhileList[# + 1 &, 1, False &, 1, 1, 1] 

Out[53]= {1, 2, 3} 

In[54]:= NestWhile[# + 1 &, 1, False &, 1, 1, 1] 

Out[54]= 3 

Hier ist eine Abhilfe Funktion für NestWhileList:

myNestWhileList[f_, expr_, test_, m_, max_, n_] := 
Module[{nwl}, 
    nwl = NestWhileList[f, expr, test, m, max]; 
    Join[nwl, Rest[NestList[f, Last[nwl], n]]] 
    ] 

In[75]:= myNestWhileList[# + 1 &, 1, False &, 1, 1, 1] 

Out[75]= {1, 2} 

Klar, es ist kein ganz allgemein Ersatz für NestWhileList, aber es sollte, wenn nötig, zu verallgemeinern leicht genug sein.

Ich habe einen Fehlerbericht eingereicht.

+0

Danke Michael - dachte, das war nur der einfachste Weg, das zu tun :) – Janus

+1

Kein Problem, und danke für die darauf hingewiesen. Sie können Fehler immer auch per E-Mail an [email protected] senden, wenn Sie das bevorzugen. –

Verwandte Themen