[英]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))))))
請注意,需要考慮三種情況:
對於第二種情況,需要考慮另外兩種情況:
這是我的看法:
(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.