Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何编写一个能够记住它的函数';s在clojure中以前的输入_Python_Clojure - Fatal编程技术网

Python 如何编写一个能够记住它的函数';s在clojure中以前的输入

Python 如何编写一个能够记住它的函数';s在clojure中以前的输入,python,clojure,Python,Clojure,所以我读了一篇文章,遇到了一个学生的问题,其中涉及到寻找最长的字符序列,而下一个符号出现在当前字符之后。例如,给定一个字符串“abzbac”,输出将是“abz”。这似乎是一个相当常见的学习任务。在输入增加/减少时采取措施。所以我知道如何用命令式的方式来做。迭代跟踪索引,查看当前索引和下一个索引是否传递谓词。我不知道如何以一种实用的方式做到这一点。我唯一的猜测是,您必须构建一个跟踪先前输入的函数,并且它是一个谓词。在python中,我认为它应该是这样的 def passTheTest(x):

所以我读了一篇文章,遇到了一个学生的问题,其中涉及到寻找最长的字符序列,而下一个符号出现在当前字符之后。例如,给定一个字符串“abzbac”,输出将是“abz”。这似乎是一个相当常见的学习任务。在输入增加/减少时采取措施。所以我知道如何用命令式的方式来做。迭代跟踪索引,查看当前索引和下一个索引是否传递谓词。我不知道如何以一种实用的方式做到这一点。我唯一的猜测是,您必须构建一个跟踪先前输入的函数,并且它是一个谓词。在python中,我认为它应该是这样的

def passTheTest(x):
    def current(y):
        temp = y == x # or w/e your comparison is
        x = y # saves state for the next go around
        return temp
您将如何在clojure中编写此函数?

您可以使用:

(应用str(:max coll
(减少(fn[{:keys[max coll]}e)
(设[coll'(如果(>=0(比较(peek coll)e))
(康科莱)
[e] )]
{:coll coll'

:max coll(如果(我也会使用reduce,但我认为这更清楚一些

;;从字符向量重建字符串
(应用str)
;从[跑acc]
(一)
(减少
(fn[[运行acc]ele]
;如果上升,则添加到acc
(让[acc](如果(位置)(比较ele(peek acc)))
(联合acc ele)
[ele])
;如果acc较长,则更换管路
运行“(最大密钥计数运行acc”)]
[运行“acc”])
[[]字符/最大值]]
"abzabczab))

一般来说,通过在函数调用之间保存状态可以做的任何事情都可以通过添加一个描述先前状态的参数来完成。不同之处在于,如果需要,添加的参数可以更灵活地执行操作,并且如果您可以假设状态未存储在函数中,则代码更易于理解和调试。

有点不同的方法。
首先让我们看一下,我们感兴趣的是序列是否是升序。这实际上不是单个值的属性,而是值的序列对。因此,如果我们可以根据序列对重新转换问题,那么在每一点上,我们都有我们需要的数据,而没有状态。要生成这些对,我们可以使用
分区
每次取2个值,但按1的步进。例如,
(分区2 1“abzbac”)
为我们提供了
(\a\b)(\b\z)(\z\b)…。

现在,我们通常的映射、过滤器等又开始工作了:

(defn最长递增[str]
(让[pairs(分区2-1-str);;将字符串分成顺序对
定向(按(comp neg?(部分应用比较))对划分);根据第二个字符是“高”还是“低”对对进行分组
升序(过滤#(负)(应用比较(第一个%))方向);过滤掉所有降序序列
最长(应用(部分最大密钥计数)递增);;取最长序列
(clojure.string/join(cons(ffirst-longest)(map second-longest‘‘‘)’);;将其粘合在一起。
(apply str (:max-coll
            (reduce (fn [{:keys [max-coll coll]} e]
                      (let [coll' (if (>= 0 (compare (peek coll) e) )
                                    (conj coll e)
                                    [e])]
                        {:coll coll'
                         :max-coll (if (<= (count max-coll) (count coll'))
                                     coll'
                                     max-coll)}))
                    {:max-coll [] :coll []}
                    "abyzbac")))