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]

希望这对正在发生的事情已经很清楚了