Return [] sendo salvo em DownValues
Aug 26 2020
Exemplo:
f[x_] := f[x] = (If[x < 0, Return[x]]; x)
f[1];
f[-5];
DownValues[f][[1 ;; 2]]
(* {HoldPattern[f[-5]] :> Return[-5], HoldPattern[f[1]] :> 1} *)
Eu quero salvar o valor que é retornado, sem o Return[]. Caso seja importante, a função real se parece com isto:
f[list_,n_] := f[list,n] = Block[{li = list, moreVars},
Which[
n == 0, Return@li,
li[[i1]] > 0, li[[i1]]--,
li[[i2]] > 0, li[[i2]]--,
True, Return@li
];
f[li, n - If[bla, 2, 1]]
]
Respostas
1 Hausdorff Aug 26 2020 at 19:21
Não é muito sofisticado, mas você pode usar apenas um substituto:
f[x_] := f[x] = (If[x < 0, Return[x]]; x) /. Return[z_] :> z
f[1]; f[-5];
DownValues[f][[1 ;; 2]]
{HoldPattern[f[-5]] :> -5, HoldPattern[f[1]] :> 1}
Como alternativa, talvez você possa se livrar de Returntudo. Por exemplo,
f[list_, n_] := f[list, n] =
Block[{li = list, moreVars},
Which[
n == 0,
li,
li[[i1]] > 0,
li[[i1]]--;
f[li, n - If[bla, 2, 1]],
li[[i2]] > 0,
li[[i2]]--;
f[li, n - If[bla, 2, 1]],
True,
li]
]
ou em uma abordagem mais funcional
f[list_, n_] /; n == 0 := f[list, n] = list;
f[list_, n_] /; list[[i1]] > 0 := f[list, n] =
Block[{li = list, moreVars},
li[[i1]]--;
f[li, n - If[bla, 2, 1]]
];
f[list_, n_] /; list[[i2]] > 0 := f[list, n] =
Block[{li = list, moreVars},
li[[i2]]--;
f[li, n - If[bla, 2, 1]]
];
f[list_, n_] := f[list, n] = list;
2 CarlWoll Aug 26 2020 at 22:14
Você pode usar a versão de dois argumentos de Return:
Clear[f]
f[x_] := f[x] = (If[x<0, Return[x, CompoundExpression]];x)
f[1];
f[-5];
DownValues[f][[1;;2]]
{HoldPattern [f [-5]]:> -5, HoldPattern [f [1]]:> 1}
O problema com single-arg Returné que heurísticas devem ser usadas para determinar de qual construção está sendo retornada.
1 SjoerdSmit Aug 26 2020 at 19:43
Neste caso, acho Throwe Catchprovavelmente são melhores construções para o que você deseja fazer:
f[list_,n_] := f[list,n] = Catch @ Block[{li = list, moreVars},
Which[
n == 0, Throw[li],
li[[i1]] > 0, li[[i1]]--,
li[[i2]] > 0, li[[i2]]--,
True, Throw[li]
];
f[li, n - If[bla, 2, 1]]
]
Isso dá a você um controle muito melhor sobre o fluxo do programa do que Return.
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?
George Harrison ficou chateado por suas letras de 'Hurdy Gurdy Man' de Donovan não terem sido usadas