关于简单因子函数的机制的解释

Bus*_*ton 4 haskell

我是Haskell的新手,所以我既天真又好奇.

有一个阶乘函数的定义:

factorial n = product [1..n]
Run Code Online (Sandbox Code Playgroud)

我天真地将其理解为:使每个数字的乘积在1和n之间.那么,为什么呢

factorial 0
Run Code Online (Sandbox Code Playgroud)

返回1(就我的数学不太生锈而言,这是一个好结果)?

谢谢

Ale*_*lli 13

这是因为如何 product定义,如:

product []     = 1
product (n:ns) = n * product ns
Run Code Online (Sandbox Code Playgroud)

或者等价的

product = foldr (*) 1
Run Code Online (Sandbox Code Playgroud)

通过重要的功能foldr:

foldr f z []     = z
foldr f z (x:xs) = f x (foldr f z xs)
Run Code Online (Sandbox Code Playgroud)

这里阅读折叠.但基本上,任何递归都必须有一个基本情况,并且product基本情况(在空列表中)显然必须是1.


phy*_*sis 5

关于空产品的故事漫长而有趣.

  • 将它定义为1有很多意义.
  • 尽管如此,关于我们是否有理由将0 0定义为1 还存在一些争论,尽管在大多数情况下0 0也可以被认为是空的产品.请参阅此处此处的0 0辩论.

现在我展示一个例子,当空产品约定可以产生令人惊讶的,不直观的结果.

如何定义素数的概念,而不必明确排除1?看起来很不美观,可以说"除了这个和那个"之外,"鼎盛时期就是如此." 可以用一些方便的定义来定义素数的概念,这种定义可以以"自然","自动"的方式排除1,而不明确地提及排除吗?

让我们尝试这种方法:

让我们称之为自然数Ç复合,当且仅当Ç可以写成的一些产品1,...,⋅ 一个ñ自然数,让所有的人都必须来自不同Ç.

让我们称之为自然数p素数,当且仅当p不能写成的任何一个产品一个1,ñ自然数从每一个不同的p.

让我们测试这种方法是否有益:

6 = 6⋅1
      3 2⋅
6是复合材料,该事实通过以下因式分解目击:6可被写为产品3⋅2,或与换言之,⟨3的产物,2⟩序列,记为Π ⟨3,2⟩.

直到现在,我们的新方法还可以

5 = 5⋅1
      1⋅5
5是素数,没有序列⟨ 一个1,... 一个Ñ ⟩使得

  • 其所有成员a 1,...... a n与5不同
  • 但产品本身,Π⟨ 一个1,... 一个ñ ⟩将等于5.

直到现在,我们的新方法还可以

现在让我们调查1:

1 =Π⟨⟩,

空产品是一个很好的见证,有了它,1 满足复合的定义(!!!)谁是见证人?目击因素化在哪里?它不是空产品Π⟨⟩,是空序列product的乘积.

  • Π⟨⟩等于1
  • 空产品Π⟨⟩的所有因子,即空序列的成员⟨⟩满足它们中的每一个都不同于1:仅仅因为空序列⟨⟩根本没有任何成员,因此它的成员都不能等于1 (这个论证只是一个空洞的真相,空集的成员).

因此,1是复合物(具有Π⟨⟩空积的微分因子分解).

因此,根据定义,1被排除为素数,自然和自动.我们已达到目标.为此,我们利用了关于空产品为1的惯例.

一些缺点:虽然我们成功地将1排除为素数,但同时,0"滑入":0成为素数(至少在零除数自由环中,如自然数).虽然这个奇怪的事情使得一些定理更正式(Goldbach猜想,算术的基本定理),但我不能代表它不是一个缺点.

一个更大的缺点是,这种新算法似乎变得难以理解.

在任何情况下,我只想证明将空产品定义为1可以产生形式化不直观的事物(这不一定是问题,集合理论充满了不直观的事情,看看如何免费生产黄金),但同时,它可以在某些情况下提供有用的力量.