- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在小阴谋家一书中,我们发现这个函数只支持长度小于或等于1的列表:
(((lambda (mk-length) ; A.
(mk-length mk-length))
(lambda (mk-length)
(lambda (l)
(cond
((null? l ) 0)
(else (add1 ((mk-length eternity ) (cdr l))))))))
'(1))
我想一步步研究,想写一个类似的函数,只支持长度小于或等于2的列表。
请不要通过提供如下代码来回答此问题:
(((lambda (mk-length) ; B.
(mk-length mk-length))
(lambda (mk-length)
(lambda (l)
(cond
((null? l) 0 )
(else (add1((mk-length mk-length) (cdr l))))))))
'(a b c d))
因为这个函数支持任意长度。
我已经知道如何编写这样的函数:
(((lambda (mk-length) ; C.
(mk-length
(mk-length (mk-length eternity))))
(lambda (length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (length (cdr l))))))))
'(1 2)) ;;
为了实现我的目标。但这段代码与第一个代码片段相差不止一步。
也许,我不应该改变:
(lambda (mk-length) ; D.
(mk-length mk-length)
最佳答案
TL;DR: (mk-length <b>A</b>)
(在 cond
表单内)计算 length
函数适用于长度为 0 的列表,并将使用 (<b>A</b> A)
计算 length
函数将用于处理参数列表的尾部(即 (cdr ...)
的结果)。
您的第一个代码片段 ( ;A.
) 仅适用于长度为 0 和 1 的列表。为了使它也适用于 2,替换
(mk-length <b>eternity</b>) ; length≤1
与
(mk-length ; (2) ; length≤2
<b>(lambda (x) (mk-length eternity))</b>)
有效。
(注意: (mk-length eternity)
本身计算 length≤0
,但整体函数变为 length≤1
;这是所有进一步的 length≤i
评论所指的。)
仔细观察
(((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length) ; (1)
(lambda (l)
(cond
((null? l ) 0)
(else (add1 ((mk-length ; (2) ; length≤2
<b>(lambda (x) (mk-length eternity))</b> )
(cdr l))))))))
'(1 2))
我们可以看到(mk-length <b>...</b>)
的结果在;(2)
用于处理(cdr l)
,而 argument
至 mk-length
在;(2)
将取代mk-length
在处理 (cddr l)
时的调用中.
如果(mk-length <b>eternity</b>)
使用(如您的第一个代码中所示),(cdr l)
处理正常,但是 ((<b>eternity</b> eternity) (cddr l))
自然会失败。
如果(mk-length <b>(lambda (x) (mk-length eternity))</b>)
使用,(cdr l)
处理好然后 (<b>(lambda (x) (mk-length eternity))</b> (lambda (x) (mk-length eternity))) = (mk-length <b>eternity</b>)
用于处理(cddr l)
这也可以(因此,长度 2 被正确处理),然后 ((<b>eternity</b> eternity) (cdddr l))
自然会失败(对于长度 3 及以上)。
从而处理最多三个元素的列表,
((mk-length ; (2) ; length≤3
(lambda (x) (mk-length
(lambda (x) (mk-length eternity)))) )
可以使用:
(define (eternity x) (- 1)) ; to get an error instead of looping
(((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
(lambda (l)
(cond
((null? l ) 0)
(else (add1 ((mk-length ; (2) ; length≤3
(lambda (x) (mk-length
(lambda (x) (mk-length eternity)))) )
(cdr l))))))))
'(1 2 3)) ; => 3
; ...........
; '(1 2 3 4)) ; => **error**
正如您所猜测的那样,这是使用的过渡步骤
(mk-length <b>(lambda (x) (mk-length x))</b>) ; (2) ; length≤∞
将列表的下一个元素的处理变成
(<b>(lambda (x) (mk-length x))</b> (lambda (x) (mk-length x)))
=
(<b>mk-length</b> (lambda (x) (mk-length x)))
因此适用于每个列表,无论其长度是多少。
通过 eta 转换,这只是 (mk-length mk-length)
.
关于recursion - 小阴谋家 : write function that only supports lists of length ≤ 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29435915/
我找到了以下代码片段: length = length and length or len(string) 在我看来,这应该等同于: length = length or len(string) 我能
当我使用 numpy.shape() 检查数组的形状时,我有时会得到 (length,1) 有时会得到 (length,)。看起来区别在于列向量与行向量......但它似乎并没有改变数组本身的任何内容
我正在学习 Java,有一个简单的问题。 在设置类的示例中,我看到了这一点: length >= 0 ? length : length * -1 这是什么意思? 谢谢。 最佳答案 这是一种骇人听闻的
我在阅读有关在 Ruby 中重新定义方法有多么容易的文章时遇到了以下问题: class Array alias :old_length :length def length old_l
例如在下面的代码中a和b和c是相等的。 EditText editText; editText = (EditText) findViewById(R.id.edttxt); editText.set
在昨天教授我的 JavaScript 类(class)时,我和我的学生遇到了一些有趣的功能,我认为这些功能可能值得在一个问题和我得出的答案中捕捉到。 在 Chrome 的 JS 控制台中输入 Arra
这个问题在这里已经有了答案: How can I get the size of an array, a Collection, or a String in Java? (3 个回答) 3年前关闭。
这个问题在这里已经有了答案: length and length() in Java (8 个答案) 关闭 6 年前。 我注意到在计算数组的长度时,你会这样写: arrayone.length; 但
console.log(this.slides.length()); 打印 Cannot read property 'length' of undefined.在 setTimeout 为 100
在搜索stackoverflow问题时,我发现了此链接: Error in file.download when downloading custom file。 但是,我的情况有些不同(我认为):
这个问题已经有答案了: Why does R use partial matching? (1 个回答) 已关闭 8 年前。 大家。我刚刚开始使用 swirl 学习 R 编程。 我刚刚了解到seq 。
这个问题已经有答案了: Why does R use partial matching? (1 个回答) 已关闭 8 年前。 大家。我刚刚开始使用 swirl 学习 R 编程。 我刚刚了解到seq 。
这个问题已经有答案了: How can I get the size of an array, a Collection, or a String in Java? (3 个回答) 已关闭 9 年前。
我有一个大数组,其中包含所有类型( bool 值,数组,null,...),并且我正在尝试访问它们的属性arr[i].length,但有些其中显然没有长度。 我不介意那些缺少长度的人是否返回未定义(我
我在对象的属性中有一些文本。我正在测试对象的属性中是否有要显示的文本;如果没有,那么我显示“-”而不是空白。看起来没有什么区别: if (MyObject.SomeText && MyObject.S
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Why is String.length() a method? Java - Array's length
这个问题在这里已经有了答案: obj.length === +obj.length in javascript (4 个答案) 关闭 9 年前。 我一直在读underscore.js源代码并在 _.
#include using std::cout; using std::cin; using std::string; int main(){ cout > name; cout
我正在细读 underscore.js annotated source当我遇到这个时: if (obj.length === +obj.length) {...} 我现在从this stackove
我正在查看 dotnet 运行时中的一些代码,我注意到不是这样写的: if (args.Length > 0) 他们使用这个: if (args is { Length: > 0}) 你知道用第二种方
我是一名优秀的程序员,十分优秀!