我必须编写一个递归函数来计算数字的乘积。我写下的是:
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)
它现在可以工作,但是我还有另一个问题:是否有更有效的方法?
答案 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
。