一些公式和函数

问题描述 投票:0回答:2

所以,我必须编写一个递归函数来计算任何给定数字中“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.))
;;

这不正确,因为我猜公式不对。

ocaml
2个回答
0
投票

对于第一个问题,您可能希望在第一时间生成一个位列表而不是一个整数。它应该使进一步的位操作更容易处理。

对于第二个问题,你应该先写一个单独的阶乘函数,然后在你定义

e
的时候使用它。目前,您正在混合求和计算和阶乘计算。


0
投票

如果要计算一个二进制数的

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.)
或总和。

© www.soinside.com 2019 - 2024. All rights reserved.