Smalltalk 输入的伯努利数方法错误>;1.

Smalltalk 输入的伯努利数方法错误>;1.,smalltalk,gnu-smalltalk,bernoulli-numbers,Smalltalk,Gnu Smalltalk,Bernoulli Numbers,我试图实现一个返回第n个贝努利数的方法,如下所示: Object subclass: #Bernoulli. Bernoulli class extend [ "****************************************************** * Psuedo code for bernoulli method I'm working from: *

我试图实现一个返回第n个贝努利数的方法,如下所示:

Object subclass: #Bernoulli.
Bernoulli class extend [


    "******************************************************
    *   Psuedo code for bernoulli method I'm working from: 
    *                                                 
    *   function B(n)                                       
    *       B[1] <-- 1                                      
    *       for m <-- 2 to n+1 do                           
    *           B[m] <-- 0                                  
    *           for k <-- 1 to m - 1 do                     
    *               B[m] <-- B[m] − BINOM (m, k-1) * B[k]   
    *           B[m] <-- B[m]/m                               
    *       return B[n+1]                                   
    *                                                       
    *   function BINOM (n, k)                              
    *       r <-- 1                                         
    *       for i <-- 1 to k do                             
    *           r <-- r · (n − i + 1)/i                     
    *       return r                                        
    ******************************************************"
    bernoulli: n [
        "Initialize variables"
        | B size innerLoop temp|
        size := n + 1.
        B := Array new: size.

        B at: 1 put: 1.                                                             "B[1] <-- 1"
        2 to: size do: [:m |                                                        "for m <-- 2 to (n+1) do"
            B at: m put: 0.                                                             "B[m] <-- 0"

            innerLoop := m - 1.
            1 to: innerLoop do: [:k |                                                   "for k <-- 1 to (m-1) do"
                B at: m put: (B at: m) - (Bernoulli binom: m k: (k-1)) * (B at: k).         "B[m] <-- B[m] − BINOM(m, k-1) * B[k]"
            ].    

            B at: m put: (B at: m) / m.                                                 "B[m] <-- B[m] / m"
        ].
        ^(B at: size)                                                               "return B[n+1]"
    ]

    binom: n k:k [
        | r i |                    
        r := 1.                         "r <-- 1"           
        1 to: k do: [:i |               "for i <-- 1 to k do"
            r := r * (n - i + 1) / i.       "r <-- r * (n - i + 1)/i"
        ].
        ^r                              "return r"
    ]
]



z := Bernoulli bernoulli: 3.
z printNl.
对象子类:#伯努利。
伯努利类扩展[
"******************************************************
*我使用的贝努利方法的Psuedo代码:
*                                                 
*功能B(n)

*B[1]这是原始算法的翻译。接收器是您的参数
n
,答案是从
0
n
的所有伯努利数的数组

Integer >> bernoulliNumbers
  | bernoulli |
  bernoulli := Array new: self + 1.
  bernoulli at: 1 put: 1.
  2 to: self + 1 do: [:m | 
    bernoulli at: m put: 0.
    1 to: m - 1 do: [:k | 
      bernoulli
        at: m
        put: (bernoulli at: m) - ((m binom: k - 1) * (bernoulli at: k))].
    bernoulli at: m put: (bernoulli at: m) / m].
  ^bernoulli
示例:

5 bernoulliNumbers -> #(1 -1/2 1/6 0 -1/30 0)

编辑

下面是我在
Integer
类中创建的
binom:
方法

binom: k
  | r |
  r := 1.
  1 to: k do: [:i | r := r * (self - i + 1) / i].
  ^r

这是原始算法的翻译。接收器是您的参数
n
,答案是从
0
n
的所有伯努利数的数组

Integer >> bernoulliNumbers
  | bernoulli |
  bernoulli := Array new: self + 1.
  bernoulli at: 1 put: 1.
  2 to: self + 1 do: [:m | 
    bernoulli at: m put: 0.
    1 to: m - 1 do: [:k | 
      bernoulli
        at: m
        put: (bernoulli at: m) - ((m binom: k - 1) * (bernoulli at: k))].
    bernoulli at: m put: (bernoulli at: m) / m].
  ^bernoulli
示例:

5 bernoulliNumbers -> #(1 -1/2 1/6 0 -1/30 0)

编辑

下面是我在
Integer
类中创建的
binom:
方法

binom: k
  | r |
  r := 1.
  1 to: k do: [:i | r := r * (self - i + 1) / i].
  ^r
你(我)在
(Bernoulli binom:m k:(k-1))*(B at:k)
子句周围缺少括号。它应该是这样的:

B at: m put: (B at: m) - ((Bernoulli binom: m k: (k-1)) * (B at: k)).
你(我)在
(Bernoulli binom:m k:(k-1))*(B at:k)
子句周围缺少括号。它应该是这样的:

B at: m put: (B at: m) - ((Bernoulli binom: m k: (k-1)) * (B at: k)).

这段代码给了我一个遵从性错误。我正在运行GNU Smalltalk 3.2.4。至少它告诉我psuedo代码是正确的,但我的实现不起作用。GNU Smalltalk不面向Smalltalk开发。因此,您需要一个包含完整工具集的Smalltalk,特别是一个允许您进行修复和修改的调试器continue@Mossmyr可以吗请更具体一点?您会遇到什么编译错误?@Mossmyr请先在Pharo中尝试一下。这样,您将能够更好地了解错误所在,从而更容易了解如何改进GNU Smalltalk的代码。@Mossmyr您可能没有使用GNU语法进行类扩展。本文中的代码如果您通过
Integer-extend扩展类,那么这个答案是有效的[…
而不是
Integer>…
这段代码给了我一个兼容错误。我正在运行GNU Smalltalk 3.2.4。至少它告诉我psuedo代码是正确的,但我的实现不起作用。GNU Smalltalk不面向Smalltalk开发。因此,您需要一个带有完整工具集的Smalltalk,尤其是调试工具集的Smalltalk呃,让你做修复和continue@Mossmyr您能说得更具体一点吗?您会遇到什么编译错误?@Mossmyr请先在Pharo中尝试一下。这样您就可以更好地了解错误所在,从而更容易找到改进GNU Smalltalk代码的方法。@Mossmyr您可能没有使用t类扩展的GNU语法。如果您通过
Integer extend扩展类,则此答案中的代码有效[…
而不是
整数>>…
我有点惊讶
*
没有优先于
-
并且不需要额外的括号。但这是真的!在Smalltalk中,算术表达式是从左到右的,除非由括号指定。我有点惊讶
*
没有不要优先于
-
,也不需要额外的括号。但这是真的!在Smalltalk中,算术表达式是从左到右的,除非由括号指定。