获得我应该获得整数的单位

时间:2016-08-10 21:50:59

标签: f#

我一直在尝试编写一个递归函数,它将一定数量的数字作为输入,并将所有数字的总和从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)

2 个答案:

答案 0 :(得分:7)

if是F#中的表达式而不是语句。由于它们是表达式,因此thenelse分支都需要具有相同的返回类型。这在实践中意味着,除非 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;在这方面,它(可能)使得更容易看到返回值的错误。