查找数字的乘积

时间:2018-10-06 17:44:26

标签: ocaml

我必须编写一个递归函数来计算数字的乘积。我写下的是:

let rec produsul_cifrelor x = if x = 0 then 0 else let n = x mod 10 in n * produsul_cifrelor (x/10)

问题是它总是返回0。我确定有些东西我错过了,但我找不到。你能帮我解决问题吗?该代码应计算数字的乘积,例如,如果我输入12345,则应返回1 * 2 * 3 * 4 * 5,等于120。

更新

我将代码更改为此:

let rec produsul_cifrelor x = match x with | 0 -> 0
                                           | 1 -> 1
                                           | 2 -> 2
                                           | 3 -> 3
                                           | 4 -> 4
                                           | 5 -> 5
                                           | 6 -> 6
                                           | 7 -> 7
                                           | 8 -> 8
                                           | 9 -> 9
                                           | _ -> (x mod 10) * produsul_cifrelor (x/10)

它现在可以工作,但是我还有另一个问题:是否有更有效的方法?

2 个答案:

答案 0 :(得分:2)

除非参数x为0,否则您的代码始终进行递归调用。由于它没有显示无限递归的迹象,因此您知道它至少返回0。这应该足以显示出什么问题了。

更新

您正在检查输入是否为0,因为在这种情况下答案很明显。但是,在其他输入中,答案显而易见。即,您无需进行任何乘法即可得到结果。为什么不检查所有这些?您只需一次测试即可检查所有这些值。

答案 1 :(得分:1)

IMO,语法看起来更简洁:

let rec produsul_cifrelor x =
  match x with
  | n when n < 10 -> n
  | _ -> (x mod 10) * produsul_cifrelor (x/10)

然后运行produsul_cifrelor 12345将返回120