我一直在尝试编写一个递归函数,它将一定数量的数字作为输入,并输出所有数字的总和,它们是3和5的倍数,从1到输入数字(3 + 5 + 9..n).
这是我的代码
let rec add_nums n =
if n < 1 then 0
if (n%5 > 0) then 0
else n + add_nums(n-1)
Run Code Online (Sandbox Code Playgroud)
if是F#中的表达而不是语句.由于它们是表达式,因此两个then和else分支都需要具有相同的返回类型.这意味着在实践中,你不能有一个if没有else分支,除非 then分支返回单位(允许else被省略分支).编译器看到它else被省略了,并推断出then分支的类型应该是unit.
这解决了它:
let rec add_nums n =
if n < 1
then 0
else if (n%5 > 0)
then 0
else n + add_nums(n-1)
Run Code Online (Sandbox Code Playgroud)
如果你按照if这种方式格式化,它将使这些问题变得更容易.
并且可以说你也可以把你的谓词放在一个单独的if.
我可以大胆地建议使用比赛吗?
let rec add_nums n =
match n with
| x when x < 1 -> 0
| x when x % 5 > 0 -> 0
| _ -> n + add_nums(n-1)
Run Code Online (Sandbox Code Playgroud)
添加更多条件然后有点"更容易"和(可以)更具可读性......
使用匹配也"更好",因为它(可能)使得更容易看到返回值中的错误.
| 归档时间: |
|
| 查看次数: |
87 次 |
| 最近记录: |