【问题标题】:Creating a sequence of all values in Clojure在 Clojure 中创建所有值的序列
【发布时间】:2018-11-26 08:10:46
【问题描述】:

我目前正在处理 kata 代码挑战,它有一些要求:

  1. u(0) = 1 是 u 中的第一个。
  2. 对于 u 中的每个 x,y = 2 * x + 1 和 z = 3 * x + 1 也必须在 u 中。
  3. u 中没有其他数字。

我已经构建了几个函数:

(defn test2 [x n orgN] ;;x is a counter, n is what I want returned as a list
  (println n)
  (println "this is x: " x)
  (cons n (if (not= x (- orgN 1 )) 
   (do (test2 (+ x 1) (+ 1 (* n 2)) orgN)
   (test2  (+ x 1) (+ 1 (* n 3)) orgN))
  nil)
))

(defn test2helper [n]
  (def x 1)
  (test2 x x n) 
)


(test2helper 5)

但是,这只会返回 (1 4 13 40) 并且错过了介于两者之间的一大堆值。缺点只是基于最后一个 3n+1 算法构建一个列表,而不是在我想要的时候选择任何其他值,而不是从每个重复的 n 值生成的两个值的序列。我的问题是有没有办法构建所有值的序列而不是其中的 4 个?

https://www.codewars.com/kata/twice-linear/train/clojure

【问题讨论】:

  • 我们不在这里解决家庭作业和练习,肖恩。请参阅 Clojure 编程教程。
  • 或者,将问题分解为代码行为中您不理解的部分并提出具体问题。在此过程中,您可能会找到构造函数的正确方法。
  • @Carcigenicate 很难看出iterate 在这里会有什么用处。该算法本质上是递归的,显然不能迭代。
  • @amalloy 是的,我试着把它写出来,然后意识到我误解了这个问题。我的意思是删除那条评论。
  • 也许你应该用你以后的问题创建一个新问题,而不是编辑问题

标签: clojure


【解决方案1】:

这个解决方案非常接近正确。但请记住,do 用于执行副作用,而不是用于产生值。具体来说,(do x y) 在执行x 中的副作用后返回y。但是test2 没有任何副作用:它只是返回一个列表。您正在寻找的是 (concat x y),它是一个将两个列表连接成一个更大列表的函数。

【讨论】:

  • 如何明确告诉程序从那里构造一个值 n 序列?我对这种语言很陌生,我仍在努力解决它,但感谢您的帮助
  • 正如我所说,只需将do 替换为concat。这就是所有需要改变的地方。
  • 嗯,所做的只是返回一个空列表
  • 没关系,我现在开始工作了!!非常感谢!
【解决方案2】:

虽然Alan Malloy's solution 回答了你的问题,但它并没有解决the problem you refer to,它要求序列按升序生成。

我的方法是懒惰地生成序列,根据以下模式:

(defn recurrence [f inits]
  (map first (iterate f inits)))

例如,您可以这样定义斐波那契数列:

(defn fibonacci []
  (recurrence (fn [[a b]] [b (+ a b)]) [1 1]))

=> (take 10 (fibonacci))
(1 1 2 3 5 8 13 21 34 55)

您需要的序列更难生成。狩猎愉快!


【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    相关资源
    最近更新 更多