【语法】
一、机制原理
一行代码拆解:r = (r + n / r) / 2。不靠数学库也算得出平方根:先随手猜一个值,真平方根一定落在"猜值"与"n 除以猜值"之间,取两者的平均作为新猜值,一轮比一轮更近——这就是牛顿逼近在平方根上的形态。配一个轮数上限与容差判断,逼近到位即停;初始猜值直接用 n 本身,收敛速度依然很快,二十轮之内小数点后多位就稳定了。它也是"迭代收敛"思想的最小样本:一个初始猜测加一条改进公式,反复套用直至满意。
二、错误写法
-- 错误:没有平方根库就干瞪眼,或线性扫描猜值
local r = 0
while r * r < n do
r = r + 0.01
end
三、正确写法
local function mySqrt(n)
if n <= 0 then return 0 end
local r = n
for _ = 1, 20 do
r = (r + n / r) / 2
end
return r
end
local label = panel:getChildByName("sqrtText")
label:setString(string.format("%.4f", mySqrt(10)))
四、引擎验证
十的平方根二十轮逼近收敛到 3.1623;零输入直接归零;轮数固定不发散。
五、FAQ
问:初始猜值随便设行吗?
答:行,正数起步都会收敛,取 n 本身最省事。
问:什么时候停迭代?
答:固定轮数或相邻两轮差小于容差,二选一。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【语法算法】 闭包工厂的本质就这一行: 外层函数接收配置,返回一个闭包——闭包捕获配置,后续调用使用捕获的配置——闭包工厂的…
【语法算法】 闭包工厂的本质就这一行: 外层函数接收配置,返回一个闭包——闭包捕获配置,后续调用使用捕获的配置——闭包工厂的…
【语法算法】 泛型 for 的四种形态就这两行: 泛型 for 的四种形态覆盖了 Lua 所有的遍历需求——从无序遍历到有序…
【语法算法】 string.find 的起始偏移就这一行: 第三个参数 init 是搜索的起始偏移——从字符串的第 init…
【语法算法】 CPU 时间和墙钟时间的分界就这两行: os.clock 返回 CPU 时间——程序实际占用处理器的秒数——o…
【语法算法】 元方法 __unm 的触发就这一行: 对带 __unm 的表做一元负号操作 -t 时,Lua 调用 __unm…