我一直在尝试编写一个递归函数,它将一定数量的数字作为输入,并将所有数字的总和从3输出为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)
答案 0 :(得分:7)
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)
如果您以这种方式格式化if
,则可以更轻松地捕捉此类问题。
可以说你也可以把你的谓词放在一个if
中。
答案 1 :(得分:6)
我可以大胆地建议使用匹配吗?
let rec add_nums n =
match n with
| x when x < 1 -> 0
| x when x % 5 > 0 -> 0
| _ -> n + add_nums(n-1)
添加更多条件然后更容易&#34;更容易&#34;和(可以)更具可读性......
使用匹配也是&#34;更好&#34;在这方面,它(可能)使得更容易看到返回值的错误。