scheme関数を使用してこの関数のヘルプが必要です 与えられた述語を満たす任意のリストのすべての要素を含むリストを返します。たとえば、(filter (lambda (x) (< x 5)) '(3 9 5 8 2 4 7))
は(3 2 4)
を返します。フィルタはどのように実装されていますか?
2
A
答えて
6
filterb - filterという関数が既に存在する場合に備えて。
(define filterb
(lambda (pred lst)
(cond ((null? lst) '())
((pred (car lst)) (cons (car lst) (filterb pred (cdr lst))))
(else (filterb pred (cdr lst))))))
ここでは、私はそれがよりよく見えるようにすることができると確信しています。 filter
と呼ばれる組込みプロシージャがすでに存在していて、それがその定義を上書きすることは良い考えではありませんので、私は、手続きmy-filter
という名前
(define (my-filter pred lst)
(cond ((null? lst) null)
((pred (first lst))
(cons (first lst) (my-filter pred (rest lst))))
(else (my-filter pred (rest lst)))))
お知らせ:filter
手順を記述する
4
簡単な方法。
0
は折り畳み右のインスタンスとしてfilter
を定義してみてください。
(define (my-filter op xs)
(fold-right
(lambda (next result) ...)
'()
xs))
がヒント:フィルタの教科書定義は、他のポスターは持っている(非尾)再帰一つでありif
とcons
1
を使用しますそれを理解することが重要です。あなたはライブラリ関数としてそれを書いている場合は、長いリストでスタックまたはヒープを爆破しないように、しかし、それは、末尾再帰でそれを行う方法を見つけ出すために便利です:
(define (filter pred? list)
(define (filter-aux result current-pair xs)
(cond ((null? xs)
result)
((pred? (car xs))
(set-cdr! current-pair
(cons (car xs)
'()))
(filter-aux result
(cdr current-pair)
(cdr xs)))
(else
(filter-aux result
current-pair
(cdr xs)))))
(let ((init (cons 'throw-me-out '())))
(filter-aux (cdr init) init list)))
か、let loop
構文を使用:代替末尾再帰filter
可変リストを必要としないために
(define (filter pred? xs)
(let ((result (cons 'throw-me-out '()))
(xs xs))
(let loop ((current-pair result))
(cond ((null? xs)
(cdr result))
((pred? (car xs))
(set-cdr! current-pair
(cons (car xs) '()))
(loop (cdr current-pair) (cdr xs)))
(else
(loop current-pair (cdr xs)))))))
0
を、あなたが使用することができ、このような何か:
(define (my-filter f lst)
(define (iter lst result)
(cond
((null? lst) (reverse result))
((f (car lst)) (iter (cdr lst)
(cons (car lst) result)))
(else (iter (cdr lst)
result))))
(iter lst '()))
再verseはリストを2回歩く必要がありますが、不変リスト上の一定のスタックスペースを持つO(n)時間に実装できるため、全体の時間はまだO(n)です。
関連する問題
- 1. @privateはどのように実装されていますか?
- 2. BigDecimalはどのように実装されていますか?
- 3. HttpSessionはどのように実装されていますか?
- 4. removeEventListenerはどのように実装されていますか?
- 5. INativeElementViewはどのように実装されていますか?
- 6. PTRACE_SINGLESTEPはどのように実装されていますか?
- 7. テンソルフローはどのように実装されていますか?
- 8. \ bはどのように実装されていますか?
- 9. MarshalByRefObjectはどのように実装されていますか?
- 10. クロスバリデーションはどのように実装されていますか?
- 11. タスクスケジューリングはどのように実装されていますか?
- 12. os.path.fileはどのように実装されていますか?
- 13. getchar()はどのように実装されていますか?
- 14. モバイルバックグラウンドループはどのように実装されていますか?
- 15. Collection.sortがどのように実装されていますか?
- 16. Wami Recorderは実際にどのように実装されていますか?
- 17. Objective Cではカテゴリはどのように実装されていますか?
- 18. RedisではBRPOPはどのように実装されていますか?
- 19. chshはどのようにlinuxに実装されていますか?
- 20. WebSocketハンドシェイクはどのようにPHPに実装されていますか?
- 21. ESBはどのように物理的に実装されていますか?
- 22. render_viewsはRSpecにどのように実装されていますか?
- 23. Pythonのリストクラスの__contains__メソッドはどのように実装されていますか?
- 24. Facebookのティッカーデザインはどのように実装されていますか?
- 25. pythonのfractions.limit_denominatorはどのように実装されていますか?
- 26. InputStreamのread()メソッドはどのように実装されていますか?
- 27. Jasmineの `done()`はどのように実装されていますか?
- 28. javaの "this"キーワードはどのように実装されていますか?
- 29. golangのselect文はどのように実装されていますか?
- 30. java-8のストリームメソッドはどのように実装されていますか?
問題をより明確に説明してください。フィルタ関数の実装方法を理解しようとしていますか? – mwd
この宿題はありますか?また、何を試してみましたか? – amindfv
問題が何であるかを説明するまで、私は質問をdownvoteすることを余儀なくされています。質問には、現在のところ、フィルタ機能の説明しかありません。私はポスターがまだ難しいとは言えません。 – dyoo