OCAML赔率之和

问题描述

我有一些用Ocaml编写的代码

let rec sumodds n =
   if (n mod 2)<>0 then
   let sum = sumodds (n-1) in 
   n + sum
   else sumodds(n-1);;

,并且我试图将0到n之间的所有奇数加起来,但是我不确定如何在n达到零时停止程序。如果我能得到一些帮助,那就太好了。如果程序中还有其他错误,请随时让我知道它们是什么。

解决方法

使功能停止的方法是测试“停止条件”。也就是说,您需要添加一条if语句,以测试您是否已经达到了如此低的n值,以至于结果显而易见。

通常,递归函数看起来像这样:

let rec myfun arg =
    if is_trivial_value arg then
        obvious_answer
    else
       let s = myfun (smallish_part_of arg) in
       combine arg s

您只需为参数n的平凡值添加一个检验。

更新

正如@Goswin_von_Brederlow指出的,递归函数的另一个非常常见的模式是:

let rec myfun2 accum arg =
    if is_trivial_vaue arg then
        accum
    else
        myfun2 (combine arg accum) (smallish_part_of arg)

这是上述形式的尾部递归转换。您可以使用任何一种形式进行编码,但是它们是不同的。因此,您需要牢记它们。作为FP程序员,您需要(并且将很容易地)学会在两种形式之间进行翻译。