2013-12-21 33 views
0

我想实现Euclid的扩展算法,并且我必须在这里产生多个值,现在下面的代码不显示正确的x和y值。我在跟着科伦。实现返回多个值的euclid的扩展算法不正确的结果

package algorithms; 
    import java.util.*; 
    import java.util.regex.*; 
    import java.text.*; 
    import java.math.*; 
    import java.awt.geom.*; 


public class Euclid { 
private int x; 
private int y; 
private int d; 
public static int gcd(int a, int b) 
{ 
    if(b == 0) 
     return a; 
    else return gcd(b,a%b); 
} 
public Euclid gcdExtend(Euclid e, int a, int b) 
{ 
    if(b == 0) 
    { 
     this.d = a; 
     this.x = 1; 
     this.y = 0; 
     return this; 
    } 

    Euclid e1 = gcdExtend(this,b,a%b); 
    Euclid e2 = new Euclid(); 
    this.d = e1.d;//line1 
    this.x= e1.y;//line2 
    this.y = e1.x - ((int)Math.floor((a/b)))*e1.y;//line3 
    return this;//line 4 
} 
public static void main(String[] args){ 
    Scanner input = new Scanner(System.in); 
    Euclid e = new Euclid(); 
    e = e.gcdExtend(e,28,12); 
    System.out.println("d = "+ e.d+" x = "+ e.x+" y = "+ e.y); 

    } 

    } 

但是,当我用下面的行替换行1,2,3,4(在代码中注释),它的工作原理绝对好。我在这里错过了哪个OOP概念,我的意思是为什么afetr修改它工作正常?为什么需要创建并返回一个新对象?

  e2.d = e1.d;//line1 
     e2.x= e1.y;//line2 
     e2.y = e1.x - ((int)Math.floor((a/b)))*e1.y;//line3 
     return e2;//line 4 

回答

0

我想我得到了错误,当我将“this”返回给引用类型变量“e1”时,现在它们指向相同的对象。因此,接下来的三线不作为

  this.x = e1.y //essentially means this.x = this.y! 

正确执行和下一行从而能根据需要x和y的旧值不给正确的结果。