Return []이 DownValues에 저장 됨

Aug 26 2020

예:

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} *)

반환되는 값을 Return[]. 중요한 경우 실제 함수는 다음과 같습니다.

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]]
]

답변

1 Hausdorff Aug 26 2020 at 19:21

그다지 화려하지는 않지만 대체물을 사용할 수 있습니다.

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}

또는 Return완전히 제거 할 수도 있습니다. 예를 들면

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]
   ]

또는 더 기능적인 접근 방식

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

다음의 두 인수 버전을 사용할 수 있습니다 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}

단일 인수의 문제 Return는 어떤 구조가 반환되는지 확인하기 위해 휴리스틱을 사용해야한다는 것입니다.

1 SjoerdSmit Aug 26 2020 at 19:43

이 경우, 나는 생각 Throw하고 Catch아마 당신이 원하는 무엇을 더 나은 구조입니다 :

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]]
]

이렇게하면 .NET보다 프로그램 흐름을 훨씬 더 잘 제어 할 수 있습니다 Return.