Smalltalk 输入的伯努利数方法错误>;1.
我试图实现一个返回第n个贝努利数的方法,如下所示: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: *
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中,算术表达式是从左到右的,除非由括号指定。