牛顿平方根算法条件混淆?

时间:2017-03-21 03:46:34

标签: algorithm

算法非常简单我只要看到牛顿方程

就实现了
function sq(x , e , g ){
  g = g || x / 2
  if(Math.abs( g * g - x ) < e )
    return g 
  else
    return sq( x , e , ( g + x / g ) / 2 )
}

现在这里有一个非常小的值,算法提供了一种解决方法,而且在非常大的值上,算法超出了调用堆栈。

我理解为什么

我不明白的是第一个条件.. if(Math.abs(g*g -x) < e )为什么!!如果我们在比较之前除以x就能解决问题,例如: if(Math.abs(g*g -x) / x < e)

function sq(x , e , g ){
  g = g || x / 2
  if(Math.abs( g * g - x ) / x  < e )
    return g 
  else
    return sq( x , e , ( g + x / g ) / 2 )
}

这样调用函数首先arg是你想要计算平方根的数字,第二个是epsilon,这个范围是当我得到一个值时应该是可以接受的,你可以将初始猜测定义为第三个参数 例如:

sq( 9 , 0.01)

或:

sq(9 , 0.01 , 2)

1 个答案:

答案 0 :(得分:0)

通常,您将ε指定为public static int arraysize=1; public String namabuku; public String penulis; public String Kategori; public String buku[][]=new String[arraysize][3]; public static int a=0; public void isiData(String kategori, String buku, String penulis){ this.buku[a][0]=kategori; this.buku[a][1]=buku; this.buku[a][2]=penulis; arraysize++; a++; } 的一小部分,而不是g,因为通常您会想要说结果具有一定的精度(例如,“六位数”),这是必然相对于结果。但除了解释ε参数的含义外,它没有太大的区别。

当然,除非您知道可能的参数在一组非常有限的值内,否则选择一些绝对误差阈值是没有意义的。