簡體   English   中英

如何在Scheme中使用Car和Cdr打破(11(12 13))

[英]How to break (11 (12 13)) using Car and Cdr in Scheme

我需要從列表中返回那些奇怪的值,所以我試圖使用car和cdr函數打破我的列表。 我有一個遞歸函數調用,檢查Car是否返回一個列表然后使用car和cdr進一步打破它,否則只是將第一個元素傳遞給函數調用檢查Odd。

特殊情況(10 11(12 13))的問題是汽車返回10 cdr回報(11(12 13))

然后在第二次迭代中汽車返回(11(12 13))cdr返回(11(12 13))

那我怎么能用汽車和cdr進一步打破我的清單。 我需要在最終答案中保留括號,並且只返回具有奇數整數值的列表。

對於需要在任意嵌套列表上工作的函數,我發現很容易首先編寫平面列表版本(在我們的例子中為filter-odd),然后編輯它以生成嵌套版本(我將其稱為filter-odd *)

首先是普通濾波器 - 奇數

(define filter-odd
   (lambda (ls)
      (cond
        [(null? ls) '()]
        [(odd? (car ls)) (cons (car ls) (filter-odd (cdr ls)))]
        [else (filter-odd (cdr ls))])))

現在為過濾器奇數*(一個右側將作為練習留下(雖然你似乎知道你的問題的答案))

(define filter-odd*
   (lambda (ls)
      (cond
        [(null? ls) '()]
        [(list? (car ls)) #| Do something with both car and cdr of ls |# ]
        [(odd? (car ls)) (cons (car ls) (filter-odd* (cdr ls)))]
        [else (filter-odd* (cdr ls))])))

需要注意的是,此設計模式可用於幫助編寫任何遞歸程序,並將其從僅在平面列表上工作轉換為在任意深度列表上工作。

對於具有任意嵌套級別的列表,這是一個通用解決方案:

(define (odds-list lst)
  (cond ((null? lst) '())                 ; the list is empty
        ((not (list? (car lst)))          ; first element is not a list
         (if (odd? (car lst))             ; element is odd
             (cons (car lst) (odds-list (cdr lst))) ; build the returned list
             (odds-list (cdr lst))))      ; element is even
        (else (cons (odds-list (car lst)) ; first element is a list
                    (odds-list (cdr lst))))))

請注意,需要考慮三種情況:

  1. 如果列表為空
  2. 如果列表的第一個元素不是列表
  3. 如果列表的第一個元素是列表

對於第二種情況,需要考慮另外兩種情況:

  1. 如果元素是奇數,那么我們將它添加到返回的列表中
  2. 如果元素是偶數,我們跳過它並繼續下一個元素

這是我的看法:

(define filter*
  (lambda (e f)
    (cond ((pair? e)
           (append (filter* (car e) f)
                   (filter* (cdr e) f)))
          ((null? e) '())
          ((f e) (list e))
          (else '()))))

然后你可以這樣做:

> (filter* '(1 (2 . 3) ((4 . 5))) even?)
(2 4)
> (filter* '(1 (2 . 3) ((4 . 5))) odd?)
(1 3 5)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM