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函数,但对实际的递归函数功能却感到困惑。尤其是If函数中的“ n#”是做什么的? @primefactorial [n-1]还能做什么?到底是什么应用到primefactorial [n-1]?

解决方法

第一个

mapg[list_] := Prepend[  mapg[Rest[list]],g[First[list]] ]; 

mapg[{}] := {};

mapg[{a,b,c}]

只是通过在Map[g,list]之前加上g[First[list]]来写mapg[Rest[list]]的一种方法。这里的关键部分是它们已经定义

mapg[{}] = {}

,以便有一个具体的基本案例,并且您不会无限递归。之所以有效,是因为

Rest[{a}] == {}

如果解开该调用中发生的步骤,您将得到

mapg[{a,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是质数,然后将其乘以先前的阶乘展开,否则不做任何事情,只返回先前的展开。

递归在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]

希望这是很清楚的事情