Racket,编写查找列表

时间:2018-05-13 21:23:47

标签: functional-programming scheme racket

为了理解功能编程,请帮我编写一个输出列表第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;返回

3 个答案:

答案 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;