How*_*ply 1 recursion f# tail-recursion
我是F#的新手,想通过递归方式实现列表中最不常见的多重函数,例如lcm(a,b,c)= lcm(a,lcm(b,c)),其中lcm为两个元素是从gcd计算的.
我有以下代码.我尝试将lcm函数的输入与两个元素的列表进行匹配,否则将是一个通用列表,我将其拆分为第一个元素和剩余部分."lcm(tail)"部分给出了编译器错误.它说它应该有类型"int"但是类型为"int list - > int".它看起来像是说"lcm tail"本身就是一个函数,我不明白.为什么不是int?
let rec gcd a b =
if b = 0
then abs a
else gcd b (a % b)
let lcmSimple a b = a*b/(gcd a b)
let rec lcm list = function
| [a;b] -> lcmSimple a b
| head::tail -> lcmSimple (head) (lcm (tail))
Run Code Online (Sandbox Code Playgroud)
最好的祝福.
将函数定义为时,函数let f = function | ...的参数是隐式的,因为它被解释为let f x = match x with | ....
因此let rec lcm list = function |...是两个变量的函数,它们是list隐式变量.这就是编译器声称这lcm tail是一个函数的原因 - 只传递了一个变量,它预期有两个变量.更好的代码版本是
let rec gcd a b =
if b = 0
then abs a
else gcd b (a % b)
let lcmSimple a b = a*b/(gcd a b)
let rec lcm = function
| [a;b] -> lcmSimple a b
| head::tail -> lcmSimple (head) (lcm (tail))
| [] -> 1
Run Code Online (Sandbox Code Playgroud)
已包含最后一个案例以完成模式.