为了理解功能编程,请帮我编写一个输出列表第n个元素的函数,
允许命令:
define lambda cond else empty empty? first rest cons list
list? = equal? and or not + - * / < <= > >=
示例输出:
(第四元素&#39;(a b c d e))=&gt; d
(第四元素&#39;(x(y z)w h j))=&gt; ħ
(第四元素&#39;((a b)(c d)(e f)(g h)(i j)))=&gt; (列出&#39; g&#39; h)
或'(g h)(第四元素&#39;(a b c))=&gt;空
我可以在python中写这个,但我不是一个有racket语法的家庭,
def element(lst, x=0):
counter = x;
if (counter >= 3):
return lst[0]
else:
return element(lst[1:],x+1)
a = [1,2,3,4,5,6]
print(element(a))
输出为4 与python中的上述代码进行比较。什么是函数中创建局部变量计数器的等效行为。什么是&#34;关键字&#34;返回
答案 0 :(得分:2)
看起来你想出了自己的答案。干得好!我建议采用更通用的nth
过程,以counter
为参数。这允许您获取输入列表中的任何元素
(define (nth lst counter)
(cond ((null? lst) (error 'nth "index out of bounds"))
((= counter 0) (first lst))
(else (nth (rest lst) (- counter 1)))))
现在,如果你想要一个只返回第4个元素的过程,我们创建一个专门用于通用nth
(define (fourth-element lst)
(nth lst 3))
就是这样。现在我们用你的输入测试它们
(define a `(1 2 3 (4 5) 7))
(define b `(1 2 3))
(define c `((a b)(c d)(e f)(g h)(i j)))
(define d `(a b c))
(fourth-element a) ; '(4 5)
(fourth-element b) ; nth: index out of bounds
(fourth-element c) ; '(g h)
(fourth-element d) ; nth: index out of bounds
注意,当计数器超出范围时,我选择引发error
而不是像程序那样返回值"empty"
。返回值使得无法知道您是否在列表中实际找到了值,或者是否返回了默认值。在下面的示例中,请注意您的过程无法区分两个输入
(define d `(a b c))
(define e `(a b c ,"empty"))
; your implementation
(fourth-element e) ; "empty"
(fourth-element d) ; "empty"
; my implementation
(fourth-element e) ; "empty"
(fourth-element d) ; error: nth: index out of bounds
如果您不想抛出错误,我们可以另一种方式编码nth
。我们可以返回第n个对而不是返回第n个元素,其头部包含相关元素。
下面,nth
始终返回一个列表。如果列表为空,则未找到任何元素。否则,第n个元素是结果中的first
元素。
(define (nth lst counter)
(cond ((null? lst) '())
((= counter 0) lst)
(else (nth (rest lst) (- counter 1)))))
(define (fourth-element lst)
(nth lst 3))
(define a `(1 2 3 (4 5) 7))
(define b `(1 2 3))
(define c `((a b)(c d)(e f)(g h)(i j)))
(define d `(a b c))
(define e `(a b c ,"empty"))
(fourth-element a) ; '((4 5) 7)
(fourth-element b) ; '()
(fourth-element c) ; '((g h) (i j))
(fourth-element d) ; '()
(fourth-element e) ; '("empty")
希望这可以让您开始考虑域(过程输入类型)和 codomain (过程输出类型)。
通常,您希望设计具有以下自然描述的过程:
nth
获取一个列表和一个数字,并始终返回一个列表”(best)nth
获取一个列表和一个数字并返回列表中的元素,或者如果找不到该元素则引发异常”(好,但现在你必须处理错误)避免使用
等程序nth
获取列表和数字并返回列表元素或字符串文字"empty"
如果找不到元素”(不清楚的codomain)< / LI>
通过考虑您的过程的域和codomain,您可以了解您的函数在程序的各个部分中的插入方式。使用定义不明确的域的许多过程会导致灾难性的意大利面条代码。相反,明确定义的程序可以像需要很少(或没有)胶水代码的构建块一样进行组装。
答案 1 :(得分:1)
以下是如何用Python编写它:
UIViewAlertForUnsatisfiableConstraints
与Scheme / Racket相同:
def nth(lst, idx=0):
if (len(lst) == 0):
return "empty"
elif (idx == 0):
return lst[0]
else:
return nth(lst[1:], idx - 1)
nth([1,2,3], 1)
# ==> 2
def fourth-element(lst):
return nth(lst, 4)
(define (nth lst idx)
(cond ((empty? lst) empty) ; more effiecent than (= (length lst) 0)
((= idx 0) (first lst))
(else (nth (rest lst) (- idx 1))))
(nth '(1 2 3) 1)
; ==> 2
(define (fourth-element lst)
(nth lst 4))
没有关键字。每个表单都返回最后评估的代码:
return
此(if (< 4 x)
(bar x)
(begin
(display "print this")
(foo x)))
返回if
的结果或打印“print this”,然后返回(bar x)
的结果。原因是对于(foo x)
的两个结果,它们是尾部表达式。
if
这个函数有两个表达式。第一个是死代码,因为它没有副作用,因为它不是尾部表达式,但(define (test x)
(+ x 5)
(- x 3))
是此函数返回的内容。
(- x 3)
这有3个表达式。前两个有副作用,它绑定两个局部变量,而第三个使用它来计算返回值。
答案 2 :(得分:0)
(define a `(1 2 3 (4 5) 7))
(define b `(1 2 3))
(define c `((a b)(c d)(e f)(g h)(i j)))
(define d `(a b c))
(define (my-lst-ref lst counter)
(cond[(>= counter 3) (first lst)]
[else (my-lst-ref (rest lst)(+ counter 1))]
)
)
(define (fourth-element lst)
(cond[(>= (list-length lst) 4) (my-lst-ref lst 0)]
[else "empty"]))
(fourth-element a)
(fourth-element c)
(fourth-element d)
输出:
(清单4 5)
(列出&#39; g&#39; h)
&#34;空&#34;