【问题标题】:Ada95: Recursive function for Bernoulli numbersAda95:伯努利数的递归函数
【发布时间】:2017-10-24 13:18:30
【问题描述】:

我正在尝试编写一个函数来计算正伯努耶数的第 N 个值。我想用这个递归公式来做:

到目前为止我已经尝试过:

   function Get_B(N : in Integer) return Float is

     X,Bn,Bk:Float;
   begin
     if N = 0 then
       return 1.0;
     else
       Bn:=0.0;
       for K in  0..(N-1) loop
        Bk:=Get_B(K);
        X:=1.0-Float(F(N))/(Float(F(K))*Float(F(N-K))) * 
           Bk/(Float(N)-Float(K)+1.0);
        Bn:=Bn+X;
     end loop;
     return Bn;
      end if;

   end Get_B;

其中 F 是阶乘函数(即,F(N) 表示 N!)。 我认为循环有问题,但我不知道它是什么。

我无法发布图片,但这里是等式的链接(底部): https://wikimedia.org/api/rest_v1/media/math/render/svg/2571d0a7024741c0a0ad0eb32cc9333f6024c528

【问题讨论】:

  • 为什么你认为循环有问题?
  • 我得到每个 N i 放入函数的值,但只有 N=0 、 N=1 和 N=6 给出了正确的答案。其他人给出了错误的答案。我在编写方程式时找不到错误,所以我认为它可能是问题所在的循环。
  • 在维基百科上的快速搜索表明1.0- 部分应该在循环之外
  • 哇,感谢 Egilhh,它确实做到了!你在哪里找到这些信息的?
  • @Ludd, en.wikipedia.org/wiki/Bernoulli_number 搜索“递归公式”

标签: function recursion ada bernoulli-numbers


【解决方案1】:

1.0- 应该在循环之外:

function Get_B(N : in Integer) 
               return Float is

 X,Bn,Bk:Float;
 begin
   if N = 0 then
     return 1.0;
   else
     Bn:=0.0;
     for K in  0..(N-1) loop
      Bk:=Get_B(K);
      X:=Float(F(N))/(Float(F(K))*Float(F(N-K))) * 
         Bk/(Float(N)-Float(K)+1.0);
      Bn:=Bn+X;
    end loop;
    return 1.0 - Bn;
  end if;

 end Get_B;

【讨论】:

  • 顺便说一句,当您的输入是正数(包括 0)时,您应该告诉编译器:function Get_B(N : in Natural)。如果您的阶乘函数首先返回 Float,则表达式变得更具可读性:X:=F(N)/(F(K)*F(N-K)) * Bk/Float(N-K+1);
  • 谢谢,我会改的!
猜你喜欢
  • 2023-02-01
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 2018-04-11
  • 2020-04-23
  • 1970-01-01
  • 2016-02-19
相关资源
最近更新 更多