1

我正在尝试使用带有两个参数的 SCHEME 编写代码,例如'(2 1 3) & '(abc) 并给出一个列表'(bac)。我的代码不能递归或迭代地工作。任何帮助!

(define project 
(lambda (list1 list2 list3 n b index)
(define n (length(list1)))
   (let ((i n))
     (for-each (i)
        (cond 
            ((null? list1) (display "empty"))
            (else
                (define n (car list1))
                (define index (- n 1)) 
                (define b (list-ref list2 index)) 
                (define list3 (cons list3 b)) 
                (define list1 (cdr list1)) 
                list3 ))))))
4

4 回答 4

1
(define (rearrange order l)
  (cond ((number? order) (rearrange (list order) l))
        ((list?   order) (map (lambda (num) (list-ref l (- num 1))) order))
        (else 'bad-order)))

如果您需要“复杂”的订单(例如'(1 (2 3) 4)),请使用以下命令:

(define (listify thing)
  (cond ((null? thing) '())
        ((pair? thing) (apply append (map listify thing)))
        (else (list thing))))

> (listify 10)
(10)
> (listify '(1 (2 3) 4))
(1 2 3 4)
> 

接着

(define (rearrange order l)
  (map (lambda (num) (list-ref l (- num 1)))
       (listify order)))
于 2013-06-26T14:11:28.797 回答
1

这是一个处理任意嵌套列表的版本:首先,anested-map类似于map但处理嵌套列表:

(define (nested-map func tree)
  (if (list? tree)
      (map (lambda (x)
             (nested-map func x))
           tree)
      (func tree)))

然后,我们创建一个映射器来使用它(list-ref如果列表短于 16 个元素则使用,否则首先复制到向量以获得更好的可伸缩性):

(define (rearrange indices lst)
  (define mapper (if (< (length lst) 16)
                     (lambda (i)
                       (list-ref lst (- i 1)))
                     (let ((vec (list->vector lst)))
                       (lambda (i)
                         (vector-ref vec (- i 1))))))
  (nested-map mapper indices))

请注意,在定义映射器之后,该函数只是对nested-map. 简单的!:-D

于 2013-06-26T12:53:23.070 回答
0

这是未嵌套列表的简单版本:

(define (arrange idx lst)
  (map (lambda (i) (list-ref lst i)) idx))

(arrange '(1 0 2) '(a b c))
=> '(b a c)

如果你需要使用嵌套列表,flatten 会派上用场:

(define (arrange idx lst)
  (map (lambda (i) (list-ref lst i)) (flatten idx)))

(arrange '(1 (0 2)) '(a b c))
=> '(b a c)

请注意,我使用基于 0 的索引,就像 Scheme 中的自定义一样。

于 2013-06-26T19:07:21.773 回答
0

首先想到的是:

(define (rearrange order symbols)
  (define (element i list)
    (if (= i 1) 
      (car list)
      (element (- i 1) (cdr list))))
  (define (iter order output)
    (if (null? order) 
      output
      (iter (cdr order) 
            (append output (list (element (car order) symbols))))))
  (iter order '()))

更好的解决方案:

(define (rearrange order symbols)
  (define (nth-element i list)
    (if (= i 1)
      (car list)
      (nth-element (- i 1) (cdr list))))
  (map (lambda (x) (nth-element x symbols)) order))
于 2013-06-26T12:33:41.350 回答