【问题标题】:Iterate help in ClojureClojure 中的迭代帮助
【发布时间】:2013-11-14 11:30:17
【问题描述】:

我是 Clojure 的新手,正在尝试使用内置的迭代来编写牛顿方法函数。我尝试了几件事导致以下代码。关于为什么这只是返回空括号的任何想法?我也乐于接受新想法。

(defn within-tol? 
  "returns true if the guess is within the given tolerance"
  [guess x tolerance]
  (< (abs (- (square guess) x)) tolerance))

(defn next-guess 
  [guess x] 
  (average guess (/ x guess)))

(defn average
  [x y]
  (float (/ (+ x y) 2)))

(defn abs 
  [x]
  (cond
    (< x 0) (- x)
    :else x))

(defn square 
  [x]
  (* x x))

 (defn sqrt-iter
  [guess x tolerance]
  (if (within-tol? guess x tolerance) guess
    (sqrt-iter (next-guess guess x) x tolerance)))

 (defn sqrt 
   [guess x tolerance]
   (take-while #(within-tol? % x tolerance) (iterate #((sqrt % x tolerance)) guess)))

【问题讨论】:

  • 您能否提供一个示例来说明您如何测试您的功能?还有一些函数定义缺失(至少averagesquare)。
  • 我包含了上面的其他辅助函数。一个示例调用是:(sqrt 1.4 2 0.01)
  • 不应该 sqrt 在某个时候调用 next-guess 吗?

标签: clojure newtons-method


【解决方案1】:

您的sqrt 似乎是错误的,因为它没有使用next-guess

试试看

(defn sqrt 
  [guess x tolerance]
  (first (drop-while #(not (within-tol? % x tolerance))
                     (iterate #(next-guess % x) guess))))

例子:

(sqrt 1 169 0.01) => 13.0

【讨论】:

  • 有道理!谢谢!
猜你喜欢
  • 2010-10-24
  • 2019-05-11
  • 2021-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2015-11-20
相关资源
最近更新 更多