2010-11-08 4 views
7

J'utilise NestWhileList dans une situation où il atteint souvent le' nombre maximum d'évaluations '. Après avoir obtenu des résultats de bibelots, j'ai regardé de plus près comment NestWhileList réagit à avoir un nombre maximal de résultats précis:Mathematica: argument de 'nombre maximal d'évaluations' de Grokking pour '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"}}]] 

La partie surprenante est que nmax=1 se singularise: Ici f est appliqué 2 fois, alors que pour toutes les autres valeurs, il est appliqué qu'une fois:

nmax output length 
0  2 
1  3 
2  2 

les « évaluations supplémentaires » semblent faire partie du problème. En quittant cette option donne à des résultats beaucoup plus raisonnables:

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 

Ma question: cela fait en quelque sorte le sens, ou est-ce juste un bug?

Répondre

4

Cela n'a pas de sens, et je suis à peu près sûr que c'est juste un bug. NestWhile est tout aussi affligée:

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 

est ici une fonction de contournement pour 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} 

De toute évidence, ce n'est pas remplacer complètement général pour NestWhileList, mais il devrait être assez facile de généraliser si nécessaire.

J'ai soumis un rapport de bogue.

+0

Merci Michael - pensé que c'était à peu près la façon la plus simple de le faire :) – Janus

+1

Pas de problème, et merci de le signaler. Vous pouvez toujours envoyer des bugs à [email protected], si vous préférez. –