我是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.
关于空产品的故事漫长而有趣.
现在我展示一个例子,当空产品约定可以产生令人惊讶的,不直观的结果.
如何定义素数的概念,而不必明确排除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,... 一个Ñ ⟩使得
直到现在,我们的新方法还可以
现在让我们调查1:
1 =Π⟨⟩,
空产品是一个很好的见证,有了它,1 满足了复合的定义(!!!)谁是见证人?目击因素化在哪里?它不是空产品Π⟨⟩,是空序列product的乘积.
因此,1是复合物(具有Π⟨⟩空积的微分因子分解).
因此,根据定义,1被排除为素数,自然和自动.我们已达到目标.为此,我们利用了关于空产品为1的惯例.
一些缺点:虽然我们成功地将1排除为素数,但同时,0"滑入":0成为素数(至少在零除数自由环中,如自然数).虽然这个奇怪的事情使得一些定理更正式(Goldbach猜想,算术的基本定理),但我不能代表它不是一个缺点.
一个更大的缺点是,这种新算法似乎变得难以理解.
在任何情况下,我只想证明将空产品定义为1可以产生形式化不直观的事物(这不一定是问题,集合理论充满了不直观的事情,看看如何免费生产黄金),但同时,它可以在某些情况下提供有用的力量.