我有下面的代码,除了sub()
函数试图从另一个中减去一个多项式时,一切似乎都正常工作
p4 = p1.sub(p2);
我看到输出:x+3x^5-5x^8
,当我希望看到:x-2x^3+7x^5-2x^7-5x^8
时。我无法弄清楚我的代码有什么问题,非常感谢任何帮助。提前谢谢。
public class Polynomial {
public static final int MAX_NUMBER_OF_COEFFICIENTS = 30;
private int[] coefficients = new int[MAX_NUMBER_OF_COEFFICIENTS];
public Polynomial() {
}
public Polynomial(int coefficient, int exponent) {
coefficients[exponent] += coefficient;
}
public Polynomial(int[] newcoefficients) {
for (int i = 0 ; i < MAX_NUMBER_OF_COEFFICIENTS; i++) {
coefficients[i] += newcoefficients[i];
}
}
public void insert(int coefficient, int exponent) {
coefficients[exponent] += coefficient;
}
public Polynomial add(Polynomial otherPolynomial) {
for (int i = 0 ; i < MAX_NUMBER_OF_COEFFICIENTS; i++) {
if (otherPolynomial.coefficients[i] != 0)
this.coefficients[i] += otherPolynomial.coefficients[i];
}
return new Polynomial(this.coefficients);
}
public Polynomial sub(Polynomial otherPolynomial) {
for (int i = 0 ; i < MAX_NUMBER_OF_COEFFICIENTS; i++) {
if (otherPolynomial.coefficients[i] != 0)
this.coefficients[i] -= otherPolynomial.coefficients[i];
}
return new Polynomial(this.coefficients);
}
public void sub(int coefficient, int exponent) {
this.coefficients[exponent] -= coefficient;
}
public void remove(int exponent) {
coefficients[exponent] = 0;
}
public void printout() {
boolean firstPrint = false;
if (coefficients[0] != 0) {
System.out.print(coefficients[0]);
firstPrint = true;
}
for (int i = 1 ; i < MAX_NUMBER_OF_COEFFICIENTS; i ++) {
if (coefficients[i] != 0) {
if (firstPrint == false) {
System.out.print(coefficients[i] + "x^" + i);
firstPrint = true;
}
else {
System.out.print(" + " + coefficients[i] + "x^" + i);
}
}
}
System.out.println();
}
public static void main(String[] args) {
Polynomial p1 = new Polynomial(1,1);
Polynomial p2 = new Polynomial(2,3);
Polynomial p3 = new Polynomial();
Polynomial p4 = new Polynomial();
Polynomial p5 = new Polynomial(6,3);
try {
p1.insert(3,5);
p1.sub(5,8);
p1.printout();
p2.sub(4,5);
p2.add(new Polynomial(2,7));
p2.printout();
p3 = p1.add(p2);
p3.printout();
p4 = p1.sub(p2);
p4.printout();
p5.insert(2,5);
p5.remove(3);
p5.printout();
//p1.add(new Polynomial(2,-1));
}
catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Exponent cannot be negative. " + e);
}
}
}
答案 0 :(得分:2)
该功能正在按预期工作。您不知道(可能是您)的是,当您致电p3 = p1.add(p2);
时,您将更改p1
,然后返回带有p1
系数的新多项式。因此,当您致电p4 = p1.sub(p2)
时,您将拥有与p1
之前相同的p3 = p1.add(p2)
。
所以你所拥有的更像是这样:
p3 = p1* = p1 + p2
p4 = p1** = p1* - p2
p1*
的结果为p1 + p2
。所以你现在拥有的是:
p4 = p1* - p2 = (p1 + p2) - p2 = p1
同样,如果你想返回新的多项式,不要改变现有的多项式。
更改功能add(Polynomial ..)
和sub(Polynomial ..)
:
public Polynomial add(Polynomial otherPolynomial) {
int coeff[] = new int[MAX_NUMBER_OF_COEFFICIENTS];
System.arraycopy(this.coefficients, 0, coeff, 0, MAX_NUMBER_OF_COEFFICIENTS);
for (int i = 0 ; i < MAX_NUMBER_OF_COEFFICIENTS; i++) {
// why is this anyway?
//if (otherPolynomial.coefficients[i] != 0)
coeff[i] += otherPolynomial.coefficients[i];
}
return new Polynomial(coeff);
}
public Polynomial sub(Polynomial otherPolynomial) {
int coeff[] = new int[MAX_NUMBER_OF_COEFFICIENTS];
System.arraycopy(this.coefficients, 0, coeff, 0, MAX_NUMBER_OF_COEFFICIENTS);
for (int i = 0 ; i < MAX_NUMBER_OF_COEFFICIENTS; i++) {
// why is this anyway?
//if (otherPolynomial.coefficients[i] != 0)
coeff[i] -= otherPolynomial.coefficients[i];
}
return new Polynomial(coeff);
}
这样,在分配(或调用复制构造函数)p1
和p3
时,您不会更改p4
。
编辑:
根据你的代码,一个函数一旦添加到原始调用者并且一旦不改变它就是不可能的,这是你的程序想要的。当您致电p2.add(new Polynomial(2,7));
时,您想要更改p2
,同时您希望p1.add(p2)
不要更改p1
,这在一个功能中是无法实现的。
如果您想获得问题中建议的输出,请更改
p2.add(new Polynomial(2,7));
到
p2 = p2.add(new Polynomial(2,7));
EDIT2:如果我想这样做,我会以一种完全不同的方式做到这一点。我会使用add/sub
个void
函数返回类型,并且有两个静态add/sub
函数返回新的Polynomial
并接受two Polynomials
。这些static
方法无法在实例上调用(如p1
),但只能在类上调用。
因此,如果我正在设计它,这将是我的代码:
public static Polynomial add(Polynomial p1, Polynomial p2){
Polynomial newPolynomial = new Polynomial();
for(int i=0;i< MAX_NUMBER_OF_COEFFICIENTS;i++)
newPolynomial.coefficients[i] = p1.coefficients[i]+p2.coefficients[i];
return newPolynomial;
}
public static Polynomial sub(Polynomial p1, Polynomial p2){
Polynomial newPolynomial = new Polynomial();
for(int i=0;i< MAX_NUMBER_OF_COEFFICIENTS;i++)
newPolynomial.coefficients[i] = p1.coefficients[i]-p2.coefficients[i];
return newPolynomial;
}
public void add(Polynomial otherPolynomial) {
for (int i = 0 ; i < MAX_NUMBER_OF_COEFFICIENTS; i++) {
coefficients[i] += otherPolynomial.coefficients[i];
}
}
public void sub(Polynomial otherPolynomial) {
for (int i = 0 ; i < MAX_NUMBER_OF_COEFFICIENTS; i++) {
coefficients[i] -= otherPolynomial.coefficients[i];
}
}
当你这样做时,你不能说p3.add(p1, p2)
。这会将您的主要代码更改为:
p1.insert(3,5);
p1.sub(5,8);
p1.printout();
p2.sub(4,5);
p2.add(new Polynomial(2,7));
p2.printout();
p3 = Polynomial.add(p1, p2);
p3.printout();
p4 = Polynomial.sub(p1, p2);
p4.printout();
p5.insert(2,5);
p5.remove(3);
p5.printout();
正如您所看到的p3
和p4
,您将调用Polynomial.add
和Polynomial.sub
。您可以通过了解Math.*
方法来最好地理解这一点。所有Math
库都是static
,因此您无法创建它的实例,但您可以说Math.abs
...这里的概念相同,您可以调用Polynomial.add
和等等
答案 1 :(得分:1)
在你的代码中,你混合了两个概念。
1)(不可变对象)要么将多项式编码为不可变,即add和sub不会改变成员字段,而是创建一个新数组并返回一个新对象 - 在这种情况下你必须写
Polynomial p3 = p1.add(p2)
和p1保持不变 - 或
2)(可变对象)你应该将你的多项式编码为可变并返回这个(并且不创建一个返回一个新对象) - 在这种情况下你可以写
p1.add(p2)
,类似于案例1中的p1 = p1.add(p2)。
如果是2)你可以做到
p1.add(p2).sub(p3)
类似于 p1 = p1.add(p2).sub(p3),情况1)。
您正在观察的内容称为 副作用 ,因为您的操作正在修改对象。避免副作用可能是编写使对象不可变的代码的主要动机之一。
尝试
public Polynomial add(Polynomial otherPolynomial) {
Polynomial result = new Polynomial();
for (int i = 0 ; i < MAX_NUMBER_OF_COEFFICIENTS; i++) {
if (otherPolynomial.coefficients[i] != 0)
result.coefficients[i] = this.coefficients[i] + otherPolynomial.coefficients[i];
}
return result;
}
和sub。相似。
搜索关键字immutable,mutable和side effect以获取更多详细信息。
答案 2 :(得分:0)
看起来很好,你从行
开始Polynomial p1 = new Polynomial(1,1);
这基本上是1 * x然后你调用以下行
p1.insert(3,5);
将数组的索引5设置为3,所以现在你有1 * x + 3x ^ 5,最后你打电话
p1.sub(5,8);
从数组的8索引中的值中减去5,现在就可以了 1x ^ 1 + 3x ^ 5 + -5x ^ 8