From 574abdefce7e83a6d34e273834d9361978da0207 Mon Sep 17 00:00:00 2001 From: Sanchime Date: Fri, 18 Feb 2022 21:12:27 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=92=E5=BD=92=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Basic-practice-of-FSharp/RecurseFunction.fs | 30 ++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/Basic-practice-of-FSharp/RecurseFunction.fs b/Basic-practice-of-FSharp/RecurseFunction.fs index e026452..511c5c2 100644 --- a/Basic-practice-of-FSharp/RecurseFunction.fs +++ b/Basic-practice-of-FSharp/RecurseFunction.fs @@ -6,4 +6,32 @@ module RecurseFunction // 在F#中,声明一个递归函数与常规函数有些许不同,我们需要使用rec关键字进行描述 // 如下 -let rec fact n = if n = 0 then 1 else n * fact n - 1 \ No newline at end of file +let rec fact n = + if n = 0 then + 1 + else + n * fact n - 1 + +// 任何计算都需要一个确切的结果 +// 所以我们的递归需要一个结束条件 +// 如上:if n = 0 then 1 +// 即n为0时,该计算将确立结果为1 + +// 上面表达的是一个计算阶乘的函数 +// 对于一个阶乘,我们有 +// 0! = 1 +// 1! = 1 * 1 +// 2! = 2 * 1 -> 2 * (2 - 1) +// 3! = 3 * 2 * 1 -> 3 * (3 - 1) * (3 - 1 - 1) +// 发现上面的重复计算了吗 +// 在1到n之间的自然数中,已知0的阶乘有确切结果是1,而其他结果是n * (n - 1) * ((n - 1) - 1) * ... +// 我们可以观察到n - 1的计算是重复的,因为每一个n都是上一个值 - 1 +// 可以得出1! = 1 * 1, 2! = 2 * 1!, 3! = 3 * 2!, 4! = 4 * 3! +// 所以我们可以将其归纳为n = 0 -> 1 and n * (n - 1)! +// 当然,我们上面的函数可以以一种表达力更强的描述(模式匹配) +// 这里只是说一下有这种方式构建函数,了解一下 + +// 因为不能重复命名,所以使用了fact_f的名字 +let rec fact_f = function + | 0 -> 1 + | n -> n * fact n - 1 \ No newline at end of file