从列表中获取n元素

时间:2016-01-16 04:57:53

标签: scheme racket

如何从列表中获取n元素, 我知道第一次,休息等,但如果我想要列表中的前3个元素,

即 (get-first 3(list 1 2 3 4 5 6)) - > (清单1 2 3)

(get-first 5(list 54 33 2 12 11 2 1 22 3 44)) - > (清单54 33 2 12 11)

这不是作业,但这段代码将帮助我完成作业的大局,我真的被卡住了,只需要一些提示。 我不被允许使用Lambda或build-list而且没有递归,我只需要能够通过map,filter,foldr等来完成这个...

1 个答案:

答案 0 :(得分:1)

正如@AlexisKing所提到的,你可以简单地使用Racket中内置的take程序:

(take '(1 2 3 4 5 6) 3)
=> '(1 2 3)

(take '(54 33 2 12 11 2 1 22 3 44) 5)
=> '(54 33 2 12 11)

如果由于某种原因不允许你仍然可以使用更高阶的过程而没有明确的递归来滚动你自己的版本,但是注意到不使用lambda是不可能的,允许的您提及的程序(mapfilterfoldr都会收到 lambda 作为参数,无论如何方案中的所有程序都是lambda

这是一个人为的解决方案,传递一个累加器,它记住我们在遍历它时在输入列表中的索引,并在cdr部分构建输出列表。如果不使用lambda就无法完成,但是如果它在那里遇到困难,请将其解压缩到辅助程序并传递给它:

(define (get-first n lst)
  (reverse
   (cdr
    (foldr (lambda (e acc)
             (if (= (car acc) n)
                 acc
                 (cons (add1 (car acc))
                       (cons e (cdr acc)))))
           '(0 . ())
           (reverse lst)))))

它仍然按预期工作,但是当内置程序执行相同操作时,从不会做这么复杂的事情:

(get-first 3 '(1 2 3 4 5 6))
=> '(1 2 3)

(get-first 5 '(54 33 2 12 11 2 1 22 3 44))
=> '(54 33 2 12 11)