Mathematica 上的递归函数
Recursive functions on Mathematica
我目前正在学习 Mathematica,正在阅读一些试图解释递归函数的讲义,然后他们继续给出以下示例:
mapg[list_] := Prepend[ mapg[Rest[list]] , g[First[list]] ];
mapg[{}] := {};
mapg[{a, b, c}]
输出:{g[a], g[b], g[c]}
虽然我理解各个函数(Prepend、Rest、First)的含义,但我不明白这是一个递归函数,以及它如何实际工作以给出它给出的输出。
给出的另一个例子是:
primefactorial[1] := 1;
primefactorial[n_] := If[PrimeQ[n], n # , #] &@primefactorial[n - 1]
primefactorial /@ Range[23]
给出输出:{1, 2, 6, 6, 30, 30, 210, 210, 210, 210, 2310, 2310, 30030, 30030,
30030, 30030, 510510, 510510, 9699690, 9699690, 9699690, 9699690,
223092870}
同样,虽然我了解 PrimeQ 函数和 If 函数的作用,但我对实际递归函数的作用感到困惑。特别是“n#”在 If 函数中做了什么?另外@primefactorial[n-1] 是做什么的? primefactorial[n-1] 究竟应用了什么?
第一个
mapg[list_] := Prepend[ mapg[Rest[list]] , g[First[list]] ];
mapg[{}] := {};
mapg[{a, b, c}]
只是一种通过在 g[First[list]]
到 mapg[Rest[list]]
之前写 Map[g, list]
的方法。这里的关键部分是他们定义了
mapg[{}] = {}
这样就有了一个具体的基本案例并且你不会无限递归。这是有效的,因为
Rest[{a}] == {}
如果你在那个调用中解开正在发生的事情step-wise你会得到
mapg[{a, b, c}] == Prepend[Prepend[Prepend[{}, c], b], a]
第二种情况有点微妙,因为他们使用了纯(匿名)函数表示法。在这种情况下,他们有
If[PrimeQ[n], n # , #] &@primefactorial[n - 1] ==
If[PrimeQ[n], n*primefactorial[n - 1], primefactorial[n - 1]]
这只是说如果 n
是素数,则将其乘以之前的阶乘展开式,否则什么也不做,只是 return 之前的展开式。
递归出现在 primefactorial[n - 1]
步骤中,在这里再次防止他们定义的无限递归
primefactorial[1] = 1
你可以像这样象征性地展开这个
symbolicPrimeFactorial[1] := prime[1];
symbolicPrimeFactorial[n_] := If[PrimeQ[n], prime[n]*#, #] &@symbolicPrimeFactorial[n - 1]
symbolicPrimeFactorial /@ Range[1, 23, 2] // Column
prime[1]
prime[1] prime[2] prime[3]
prime[1] prime[2] prime[3] prime[5]
prime[1] prime[2] prime[3] prime[5] prime[7]
prime[1] prime[2] prime[3] prime[5] prime[7]
prime[1] prime[2] prime[3] prime[5] prime[7] prime[11]
prime[1] prime[2] prime[3] prime[5] prime[7] prime[11] prime[13]
prime[1] prime[2] prime[3] prime[5] prime[7] prime[11] prime[13]
prime[1] prime[2] prime[3] prime[5] prime[7] prime[11] prime[13] prime[17]
prime[1] prime[2] prime[3] prime[5] prime[7] prime[11] prime[13] prime[17] prime[19]
prime[1] prime[2] prime[3] prime[5] prime[7] prime[11] prime[13] prime[17] prime[19]
prime[1] prime[2] prime[3] prime[5] prime[7] prime[11] prime[13] prime[17] prime[19] prime[23]
希望这对正在发生的事情已经很清楚了
我目前正在学习 Mathematica,正在阅读一些试图解释递归函数的讲义,然后他们继续给出以下示例:
mapg[list_] := Prepend[ mapg[Rest[list]] , g[First[list]] ];
mapg[{}] := {};
mapg[{a, b, c}]
输出:{g[a], g[b], g[c]}
虽然我理解各个函数(Prepend、Rest、First)的含义,但我不明白这是一个递归函数,以及它如何实际工作以给出它给出的输出。
给出的另一个例子是:
primefactorial[1] := 1;
primefactorial[n_] := If[PrimeQ[n], n # , #] &@primefactorial[n - 1]
primefactorial /@ Range[23]
给出输出:{1, 2, 6, 6, 30, 30, 210, 210, 210, 210, 2310, 2310, 30030, 30030, 30030, 30030, 510510, 510510, 9699690, 9699690, 9699690, 9699690, 223092870}
同样,虽然我了解 PrimeQ 函数和 If 函数的作用,但我对实际递归函数的作用感到困惑。特别是“n#”在 If 函数中做了什么?另外@primefactorial[n-1] 是做什么的? primefactorial[n-1] 究竟应用了什么?
第一个
mapg[list_] := Prepend[ mapg[Rest[list]] , g[First[list]] ];
mapg[{}] := {};
mapg[{a, b, c}]
只是一种通过在 g[First[list]]
到 mapg[Rest[list]]
之前写 Map[g, list]
的方法。这里的关键部分是他们定义了
mapg[{}] = {}
这样就有了一个具体的基本案例并且你不会无限递归。这是有效的,因为
Rest[{a}] == {}
如果你在那个调用中解开正在发生的事情step-wise你会得到
mapg[{a, b, c}] == Prepend[Prepend[Prepend[{}, c], b], a]
第二种情况有点微妙,因为他们使用了纯(匿名)函数表示法。在这种情况下,他们有
If[PrimeQ[n], n # , #] &@primefactorial[n - 1] ==
If[PrimeQ[n], n*primefactorial[n - 1], primefactorial[n - 1]]
这只是说如果 n
是素数,则将其乘以之前的阶乘展开式,否则什么也不做,只是 return 之前的展开式。
递归出现在 primefactorial[n - 1]
步骤中,在这里再次防止他们定义的无限递归
primefactorial[1] = 1
你可以像这样象征性地展开这个
symbolicPrimeFactorial[1] := prime[1];
symbolicPrimeFactorial[n_] := If[PrimeQ[n], prime[n]*#, #] &@symbolicPrimeFactorial[n - 1]
symbolicPrimeFactorial /@ Range[1, 23, 2] // Column
prime[1]
prime[1] prime[2] prime[3]
prime[1] prime[2] prime[3] prime[5]
prime[1] prime[2] prime[3] prime[5] prime[7]
prime[1] prime[2] prime[3] prime[5] prime[7]
prime[1] prime[2] prime[3] prime[5] prime[7] prime[11]
prime[1] prime[2] prime[3] prime[5] prime[7] prime[11] prime[13]
prime[1] prime[2] prime[3] prime[5] prime[7] prime[11] prime[13]
prime[1] prime[2] prime[3] prime[5] prime[7] prime[11] prime[13] prime[17]
prime[1] prime[2] prime[3] prime[5] prime[7] prime[11] prime[13] prime[17] prime[19]
prime[1] prime[2] prime[3] prime[5] prime[7] prime[11] prime[13] prime[17] prime[19]
prime[1] prime[2] prime[3] prime[5] prime[7] prime[11] prime[13] prime[17] prime[19] prime[23]
希望这对正在发生的事情已经很清楚了