Clojure 函数接受顺序参数并拥有以前的值

Clojure 函数接受顺序参数并拥有以前的值,clojure,Clojure,我正在和你一起工作。更具体地说,是用于滤波和平滑的正向和反向算法。我已经确定了一个表示,并有一个向前工作的fn,它接受隐藏变量和模型的先前概率分布,并返回新的概率分布。现在我想要一个过滤函数,它接受一系列传感器状态和一个模型,并返回一个由 初始状态(包含在模型中) 在返回序列中的前一个状态、下一个传感器状态和模型上使用forward的结果 重复2次,直到不再保留传感器状态 我已经设法通过递归实现了这一点,但由于它不是尾部位置递归,它打破了递归,似乎不惯用,通常是一个糟糕的解决方案。我曾尝试将其用

我正在和你一起工作。更具体地说,是用于滤波和平滑的正向和反向算法。我已经确定了一个表示,并有一个向前工作的fn,它接受隐藏变量和模型的先前概率分布,并返回新的概率分布。现在我想要一个过滤函数,它接受一系列传感器状态和一个模型,并返回一个由

  • 初始状态(包含在模型中)
  • 在返回序列中的前一个状态、下一个传感器状态和模型上使用forward的结果
  • 重复2次,直到不再保留传感器状态
  • 我已经设法通过递归实现了这一点,但由于它不是尾部位置递归,它打破了递归,似乎不惯用,通常是一个糟糕的解决方案。我曾尝试将其用于for、reduces和iterate,但我似乎无法使它们中的任何一个都适合。有什么办法可以改进吗

    (defn filtering
      "Perform filtering to decide the likely state based on evidence.
      Returns a sequence of state probabilities given a sequence of evidence."
      [evidence {:keys [transition sense initial state-map] :as model}]
      (if (empty? evidence)
        (vector initial)
        (let [reading (first evidence)
              history (filtering (drop 1 evidence) model)
              previous-state (vector (peek history)) 
              fwd (forward previous-state reading model) ]
          (conj history fwd)
          )
        )
      )
    

    递归首先下到
    证据的末尾
    并生成
    (:初始模型)
    。这是减少的初始值

    然后,递归的每个返回级别将
    #(正向%1%2模型)
    应用于较低递归级别(如
    %1
    ,由
    peek
    )和下一个证据元素(如
    %2
    )的应用程序结果。这段代码迭代地将一个双参数函数应用于序列中的连续元素(以相反的顺序进行)——显然是
    reduce
    的例子

    但是,这些结果被累积在
    历史
    向量中,该向量返回到递归的上层<代码>减少累积结果为
    减少
    。所以我相信代码的结构大致如下:

    (reductions #(forward %1 %2 model) (:initial model) (reverse evidence))
    

    递归首先下到
    证据的末尾
    并生成
    (:初始模型)
    。这是减少的初始值

    然后,递归的每个返回级别将
    #(正向%1%2模型)
    应用于较低递归级别(如
    %1
    ,由
    peek
    )和下一个证据元素(如
    %2
    )的应用程序结果。这段代码迭代地将一个双参数函数应用于序列中的连续元素(以相反的顺序进行)——显然是
    reduce
    的例子

    但是,这些结果被累积在
    历史
    向量中,该向量返回到递归的上层<代码>减少累积结果为
    减少
    。所以我相信代码的结构大致如下:

    (reductions #(forward %1 %2 model) (:initial model) (reverse evidence))
    

    将%1替换为(向量%1)并成功!谢谢。快速提问:#()宏,是否等同于匿名(fn[ab])?仍然在寻找Clojure的方法,我以前从未见过它。@user1571406是的,它是匿名函数literal的读取器宏:将%1替换为(向量%1),它成功了!谢谢。快速提问:#()宏,是否等同于匿名(fn[ab])?仍然在寻找Clojure的方法,我以前从未见过它。@user1571406是的,它是匿名函数literal的读取器宏: