Java 中的 Jacobsthal 数

2024年9月10日 | 阅读 6 分钟

在本节中,我们将学习如何在 Java 中查找 Jacobsthal 数。数学上,Jacobsthal 数定义为

Ja = (2a - (-1)a) / 3,其中 a >= 0

因此,

对于 a = 0,

J0 = (20 - (-1)0) / 3 = (1 - (1)) / 3 = 0 / 3 = 0

对于 a = 1,

J1 = (21 - (-1)1) / 3 = (2 - (-1)) / 3 = 3 / 3 = 1

对于 a = 2,

J2 = (22 - (-1)2) / 3 = (4 - (1)) / 3 = 3 / 3 = 1

对于 a = 3,

J3 = (23 - (-1)3) / 3 = (8 - (-1)) / 3 = 9 / 3 = 3

对于 a = 4,

J4 = (24 - (-1)4) / 3 = (16 - (1)) / 3 = 15 / 3 = 5

对于 a = 5,

J4 = (25 - (-1)5) / 3 = (32 - (-1)) / 3 = 33 / 3 = 11

实施

让我们看看如何实现上述数学公式。请看下面的 Java 程序。

文件名: JacobsthalNumberExample1.java

输出

The first 20 Jacobsthal numbers are: 
0 1 1 3 5 11 21 43 85 171 341 683 1365 2731 5461 10923 21845 43691 87381 174763

使用递归

也可以使用递归来查找 jacbosthal 数。但是,要使用递归查找 jacbsthal 数,我们必须知道它的递归公式。

J0 = 0 and J1 = 1

&

Ja = Ja - 1 + 2 * Ja - 2,对于 a >= 2

因此,

对于 a = 2

J2 = J2 - 1 + 2 * J2 - 2 = J1 + 2 * J0 = 1 + 2 * 0 = 1 + 0 = 1

对于 a = 3,

J3 = J3 - 1 + 2 * J3 - 2 = J2 + 2 * J1 = 1 + 2 * 1 = 1 + 2 = 3

对于 a = 4,

J4 = J4 - 1 + 2 * J4 - 2 = J3 + 2 * J2 = 3 + 2 * 1 = 3 + 2 = 5

对于 a = 5,

J5 = J5 - 1 + 2 * J5 - 2 = J4 + 2 * J3 = 5 + 2 * 3 = 5 + 6 = 11

实施

让我们看看上述递归公式的实现。

文件名: JacobsthalNumberExample2.java

输出

The first 20 Jacobsthal numbers are: 
0 1 1 3 5 11 21 43 85 171 341 683 1365 2731 5461 10923 21845 43691 87381 174763

迭代实现

除了递归,也可以使用循环来查找 jacbsthal 数。下面的程序对此进行了说明。

实施

让我们以迭代的方式看看上述递归公式的实现。

文件名: JacobsthalNumberExample3.java

输出

The first 20 Jacobsthal numbers are: 
0 1 1 3 5 11 21 43 85 171 341 683 1365 2731 5461 10923 21845 43691 87381 174763

上述程序使用一个数组来计算 jacbsthal 数,其大小取决于我们想要查找的 jacbsthal 数的总数。因此,要计算多达 10 个 jacbsthal 数,我们将使用大小为 10 的数组,要计算多达 20 个 jacbsthal 数,我们将使用大小为 20 的数组。如果我们仔细观察,会发现当前的 jacbsthal 数取决于最后两个 jacbsthal 数。在下面的递归公式中,

Ja = Ja - 1 + 2 * Ja - 2

Ja - 1 是最后一个 jacbsthal 数,Ja - 2 是倒数第二个 jacbsthal 数。

因此,我们可以不使用数组,而只使用两个变量来查找 jacbsthal 数。下面的程序说明了这一点。

文件名: JacobsthalNumberExample4.java

输出

The first 20 Jacobsthal numbers are: 
0 1 1 3 5 11 21 43 85 171 341 683 1365 2731 5461 10923 21845 43691 87381 174763

注意:上述方法是查找 Jacobsthal 数的最佳方法,因为程序的空间复杂度为 O(1),而且与其它方法相比,它耗时最少。


下一主题Java BLOB