【问题标题】:Clojure Fibonacci series using while in atomClojure 斐波那契数列在 atom 中使用 while
【发布时间】:2022-01-06 16:30:58
【问题描述】:

如何在斐波那契数列上使用 Clojure 原子来实现这一点。

(def x 0)
(def y 0)
(def z 1)
(defn problem [] 
    (def a (atom 0))
    (while (< @a 10 )
    (do 
      ;logic code need to write to achieve the output
      ; how can I add b,c == c,b???????.)
     (swap! a inc)))

(problem)

输出应该是 0 1 1 2 3 5 8 13 21 34 55

【问题讨论】:

  • problem 函数似乎只是将原子从 0 增加到 9。而不是您的评论,请尝试 (println @a)。这应该可以帮助您找出自己做错了什么。
  • 至少您需要添加一个输出语句,如前所述。但是inc 不只是将值增加1 吗?这似乎不是特别像斐波那契那样。
  • 您正在与不可变/函数式编程语言中的命令式编程思维作斗争。原子是初学者在学习语言时不应该关注的高级主题,但它是初学者为了熟悉而掌握的东西。学习 Clojure 最难的部分不是记住将括号放在左侧,而是不可变性和 FP(如果这不是您的背景)。如果您从声称教授 clojure 的来源获得此任务或解决方案的方法,请放弃此来源。

标签: clojure


【解决方案1】:

正如 cmets 中所提到的,在函数中定义和使用原子是一种完全非 Clojure 解决问题的方法,这使得解决问题变得更加困难。您应该熟悉不变性和高阶函数(如 map、filter、reduce 等)的概念。

下面的代码给你你想要的。

(def fib1
  (fn [n]
    (cond
      (= n 0) 1
      (= n 1) 1
      :else (+ (fib1 (dec n)) (fib1 (- n 2))))))

因为这只是给你第 n 个斐波那契数,如果你想得到你想要的,你应该带上 + 地图。

(take 10 (map fib1 (range))) => (1 1 2 3 5 8 13 21 34 55)

看看我在互联网上找到的这个漂亮的解决方案。

(def fib-seq-iterate (map first (iterate (fn [[n m]] [m (+ n m)]) [0 1])))

这会返回一个惰性序列,可以用

(take 5 fib-seq-iterate) => (0 1 1 2 3)

【讨论】:

    猜你喜欢
    • 2011-08-07
    • 2018-10-15
    • 2015-06-05
    • 2016-04-28
    • 2013-10-19
    • 2017-04-03
    • 2012-02-14
    相关资源
    最近更新 更多