所以,我必须编写一个递归函数来计算任何给定数字中“1”的数量。对于这一部分,我设法创建了将十进制转换为二进制的函数:
let rec f dec =
if dec = 0 then 0
else dec mod 2 + 10 *f(dec/2)
;;
但我不知道如何让程序检查每个数字,甚至计算想要的数字。
我必须编写一个函数来计算 1/(n!) 系列的总和。再一次,我尝试了几个小时,但我能做的最好的是:
let rec e n =
if n <= 1. then 1.
else 1./.(n*.e(n-.1.)) +. (e(n-.1.))
;;
这不正确,因为我猜公式不对。
对于第一个问题,您可能希望在第一时间生成一个位列表而不是一个整数。它应该使进一步的位操作更容易处理。
对于第二个问题,你应该先写一个单独的阶乘函数,然后在你定义
e
的时候使用它。目前,您正在混合求和计算和阶乘计算。
如果要计算一个二进制数的
1
:
let rec count_1 n =
if n=0 then 0
else
(if n mod 2 = 1 then 1 else 0) + count_1 (n/2)
对于1 / n的总和! :
let f n =
let inv_fact = ref 1.0 in
let sum = ref 0. in
for i=1 to n do
inv_fact := !inv_fact /. (Float.of_int i);
sum := !sum +. !inv_fact
done
我们也可以不那么迫切:
let my_f n =
let rec f n max inv_fact =
if n>max then 0.
else
let inv_fact' = inv_fact /. (Float.of_int n) in
inv_fact' +. f (n+1) max inv_fact'
in f 1 n 1.
使用您的
e
函数,我们不知道它是否应该返回逆阶乘(您使用 e(n-.1.)
或总和。