- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在尝试为要解决的问题编写代码时遇到问题。它是这样的:
~ 目标:将嵌套列表展平为一个数字
示例:
(CONDENSE '(2 3 4 (3 1 1 1) (2 3 (1 2)) 5))
(2 3 4 (6) (2 3 (3)) 5)
(2 3 4 (6) (8) 5)
(28)
=> 28
我已经尝试为这个问题实现扁平化列表功能,结果是这样的:
(defun condense (lst)
(cond
((null lst) nil)
((atom lst) (list lst)))
(t (append (flatten (apply #'+ (cdr lst))))))
但它给了我错误:(
任何人都可以向我解释我的处理/代码有什么问题吗?我该如何改进它?
更新:2012 年 6 月 5 日
(defun condense(lxt)
(typecase lxt
(number (abs lxt))
(list
(if (all-atoms lxt)
(calculate lxt)
(condense (mapcar #'condense lxt))))))
所以在这里,在此代码中,显示了我的真实意图。我有一个函数 calculate
,它根据列表中的值执行计算。不一定每次都是一样的操作。另外,我知道我正在返回数字的绝对值;我这样做是因为我找不到另一种方法来返回数字本身。如果 lxt
是一个数字,我需要找到一种返回数字的方法。我让它在底部递归两次,因为这是它无限循环直到它计算出一个数字的一种方式。注意:此函数不再实现展平函数,也不再使用其中的任何内容。
最佳答案
假设您已经有了自己的函数。它得到什么?它必须生产什么?
给定一个原子,它返回什么?给定一个简单的原子列表,它应该返回什么?
(defun condense (x)
(typecase x
(number
; then what?
(condense-number x))
(list
; then what?
(if (all-atoms x)
(condense-list-of-atoms x) ; how to do that?
(process-further-somehow
(condense-lists-inside x))))
; what other clauses, if any, must be here?
))
condense-lists-inside
必须做什么?根据你的描述,就是把里面的嵌套列表压缩成一个数,原子完好无损。所以它会留下一个数字列表。为了以某种方式进一步处理,我们已经“拥有”一个函数,condense-list-of-atoms
,对吧?
现在,如何实现condense-lists-inside
?很简单,
(defun condense-lists-inside (xs)
(mapcar #'dowhat xs))
做什么?为什么,condense
,当然!请记住,我们想象我们已经拥有它。只要它得到了它想要得到的东西,它就应该生产它设计用来生产的东西。即,给定一个原子或一个列表(内部可能有嵌套列表),它将产生一个数字。
现在,填空并简化。特别是,看看您是否真的需要 all-atoms
检查。
编辑:实际上,使用 typecase
是一个不幸的选择,因为它将 NIL 视为 LIST。我们需要区别对待 NIL,返回一个“零值”。所以最好使用通常的 (cond ((null x) ...) ((numberp x) ...) ((listp x) ...) ... )
构造。
关于您的新代码:您犯了错误:要处理 (mapcar #'condense x)
之后返回的原子列表,我们有一个函数 calculate
也就是说,无需回溯到 condense
本身。当您在此处替换 calculate
时,很明显根本不需要检查 all-atoms
;它只是一种教学手段,可以简化代码的开发。 :) 在我们开发时做出多余的选择是可以的,如果我们随后将它们简化,在我们实现了正确性<的目标/em>!
但是,删除 all-atoms
检查将破坏您的要求 #2。然后计算将进行如下
(CONDENSE '(2 3 4 (3 1 1 1) (2 3 (1 2)) 5))
==
(calculate (mapcar #'condense '(2 3 4 (3 1 1 1) (2 3 (1 2)) 5)))
==
(calculate (list 2 3 4 (condense '(3 1 1 1)) (condense '(2 3 (1 2))) 5))
==
(calculate (list 2 3 4 (calculate '(3 1 1 1))
(calculate (list 2 3 (calculate '(1 2)))) 5))
==
(calculate (list 2 3 4 6 (calculate '(2 3 3)) 5))
==
(calculate (list 2 3 4 6 8 5))
==
28
即它将以从左到右的方式进行,而不是从最深的嵌套层开始。将嵌套列表想象成一棵树(它确实是),这将从最深的左角向上和向右“咀嚼”树;具有all-atoms
检查的代码将严格按级别执行。
所以最后的简化代码是:
(defun condense (x)
(if (listp x)
(reduce #'+ (mapcar #'condense x))
(abs x)))
备注:查看最后一个归约序列图,清晰的画面出现了——替换参数中的每个节点tree 与 calculate 应用程序。这是一个明显的例子 folding ,就像 reduce
那样在树上而不是普通列表上完成。
这可以直接用所谓的“car-cdr 递归”编码,将每个 cons
单元格替换为对递归的两个结果应用组合函数 f
调用单元格的 car
和 cdr
组件:
(defun condense (x) (reduce-tree x #'+ 0))
(defun reduce-tree (x f z)
(labels ((g (x)
(cond
((consp x) (funcall f (g (car x)) (g (cdr x))))
((numberp x) x)
((null x) z)
(T (error "not a number")))))
(g x)))
如您所见,这个版本是高度递归的,这不是很好。
关于lisp - 将 Lisp 代码形成任务——与展平列表方法相关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10890612/
您好,我有一个使用 JSON.Stringify 输出到此的对象 {"0":["test1","ttttt","","","","","","","",""],"1":["test2","ghjgjh
我有以下数据框,它是执行 groupby + 聚合总和的结果: df.groupby(['id', 'category']).agg([pd.Series.sum])
我有一个 3D 三角形带(见插图)。三角形不在一个平面内。 我想展平三角形带,使所有三角形都位于第一个三角形的平面内。 计划是围绕与第一个三角形的连接边旋转第二个三角形,使其与第一个三角形在同一平面内
简单地说,我正在寻找可在 iOS 上使用的与 NSBezierPath 的 -bezierPathByFlatteningPath 等效的方法。这对我来说是直接处理 CGPath 的函数还是 UIBe
假设我有以下 JToken: @"{ ""data"": [ { ""company"": { ""ID"": ""12
如果我在多个分支中处理单个功能,我会使用 git pull branch1 branch2 branch3 将所有更改 pull 入我的主分支。但是,每个分支的所有提交日志也会被复制。如何将提交日志扁
这个问题在这里已经有了答案: How do I make a flat list out of a list of lists? (33 个答案) 关闭6年前。 假设我们有一个返回列表(或有限迭代器)
给定如下模式: root |-- first_name: string |-- last_name: string |-- degrees: array | |-- element: struc
我有一个包含多个列的表,其中一些列是相同长度的数组。我想解除它们的嵌套,以获得包含来自不同行中的数组的值的结果。 所以有这样一张 table : 我想去: 这是其中一个数组列的工作方式: WITH d
我最近买了一台 RICOH THETA S,用于在 360 vr 中录制足球比赛。 我想使用 ffmpeg 将我用我的相机录制的鱼眼电影展平,这可能吗? enter image description
这是我的 question 的后续.是否可以将表格展平为如下所示,而不是数据透视表: data = {'year': ['2016', '2016', '2015', '2014', '2013'],
我目前正在将我的 jruby/java2d 图形绘制/布局应用程序移植到 macruby/cocoa。因此我需要获取开放的 NSBezierPath 与封闭的 NSBezierPath 的交点。 在
是否有一种简单的方法来展平一组 try 以给出尝试值的成功或失败? 例如: def map(l:List[Int]) = l map { case 4 => Failure(new Excepti
我有一个包含数百万行的“服务”表。每行对应于工作人员在给定日期和时间间隔内提供的服务(每行都有一个唯一的 ID)。在某些情况下,工作人员可能会在重叠的时间范围内提供服务。我需要编写一个查询来合并重叠的
我在使用Elastic Search(ES)检索JSON对象时遇到问题。现在,当我尝试使用下面的请求正文从ES查询一些数据时, "_source": [ "data.id", "dat
我有一个订单流(来源是订单列表)。每个订单都有一个 Customer 和一个 OrderLine 列表。 我想要实现的是拥有一个以客户为键的 map ,以及属于该客户的所有订单行,在一个简单的列表中作
给定一个如下所示的复杂对象: case class Complex ( id: Long, name: String, nested: Seq[Complex] ) 实际上,这可能会变成这
我很好奇你如何将数组 Promise 映射的结果展平。我有一个函数 Promise.maps 一组值,它们本身就是 promise (需要解析)并返回一个数组。所以,我得到类似的结果: [ [1, 2
我是 CouchDB 的新手,我只是想评估它在常见任务中的实用性。其中一项任务是生成报告。我的问题是:如果我有这样的文档结构: { "_id": "29763f342ab34fd7b579fd4
假设我们有这样的 map : %{"a": %{"b": 2, "c":5}, "d": 1} 有没有类似this function的东西(js回答同一问题)内置elixr? 最终结果应该是: %{"
我是一名优秀的程序员,十分优秀!