2010-11-08 6 views
7

Estoy usando NestWhileList en una situación donde a menudo alcanza el 'número máximo de evaluaciones'. Después de conseguir algunos resultados curiosos, me echó un vistazo más de cerca cómo NestWhileList reacciona a tener un número máximo de resultados se especifica:Mathematica: argumento Grokking 'número máximo de evaluaciones' para `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 parte sorprendente es que nmax=1 se destaca: Aquí f se aplica 2 veces, mientras que para todos los demás valores, sólo se aplica una vez:

nmax output length 
0  2 
1  3 
2  2 

las evaluaciones adicionales '' parecen ser parte del problema. Dejando que la opción de salir da resultados mucho más razonables:

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 

Mi pregunta: ¿Tiene esto de alguna manera tiene sentido, o es sólo un error?

Respuesta

4

No tiene sentido, y estoy bastante seguro de que es solo un error. NestWhile es igualmente afligidos:

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 

Aquí es una función solución para 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} 

Claramente, no es un reemplazo completo general para NestWhileList, pero debe ser lo suficientemente fácil generalizar si es necesario.

He enviado un informe de error.

+0

Gracias Michael: pensé que esta era la forma más sencilla de hacerlo :) – Janus

+1

No hay problema, y ​​gracias por señalarlo. Siempre puede enviar errores por correo electrónico a [email protected] también, si lo prefiere. –