Tôi tự hỏi liệu có thể định nghĩa một hàm đệ quy mà không cần gọi hàm đó trong cơ thể của nó nhưng bằng cách nào đó sử dụng lệnh gọi/cc thay thế? Cảm ơn.Có thể sử dụng lệnh gọi/cc để thực hiện đệ quy không?
Trả lời
Bạn có thể triển khai bộ kết hợp Y bằng cách sử dụng call/cc
, as described here. (! Rất cám ơn đến John Cowan đề cập đến bài gọn gàng này) Trích dẫn bài đó, đây là thực hiện Oleg của:
luỵ 1. Y Combinator qua
call/cc
- Y Combinator mà không có một tự ứng dụng rõ ràng.(define (Y f) ((lambda (u) (u (lambda (x) (lambda (n) ((f (u x)) n))))) (call/cc (call/cc (lambda (x) x)))))
Ở đây, chúng tôi sử dụng một thực tế là
((lambda (u) (u p)) (call/cc call/cc))
và
((lambda (u) (u p)) (lambda (x) (x x)))
là observationally tương đương.
Câu hỏi của bạn hơi mơ hồ. Đặc biệt, có vẻ như bạn muốn một hệ thống mô hình các cuộc gọi đệ quy mà không trực tiếp thực hiện các cuộc gọi đệ quy, sử dụng lệnh gọi/cc. Mặc dù vậy, hóa ra bạn có thể lập mô hình các cuộc gọi đệ quy mà không thực hiện các cuộc gọi đệ quy và cũng mà không cần sử dụng lệnh gọi/cc. Ví dụ:
#lang racket
(define (factorial f n)
(if (= n 0) 1 (* n (f f (- n 1)))))
(factorial factorial 3)
Điều đó có vẻ như gian lận, nhưng đó là nền tảng của bộ kết hợp Y. Có lẽ bạn có thể thắt chặt các hạn chế mà bạn đang nghĩ đến?
P.S .: nếu đây là bài tập về nhà, hãy trích dẫn tôi!
Vâng, tôi đã biết mẹo này để thực hiện đệ quy. Những gì tôi tự hỏi là nếu một cách không tự giới thiệu bằng cách sử dụng cuộc gọi/cc tồn tại để xác định một hàm đệ quy, nói 'giai thừa' của bạn. Đây không phải là bài tập về nhà! Cảm ơn. – day
@plmday Giải pháp của John đã không tự tham khảo. Bạn cần thêm những gì từ 'call/cc'? –
@ SamTobin-Hochstadt Vâng, đó là, 'f' đề cập đến chính nó, phải không?Tôi muốn xem chúng ta có thể đi xa như thế nào với 'call/cc', đặc biệt, với khả năng của nó, chúng ta có thể sử dụng nó để mô phỏng cách thông thường hay không bình thường của việc định nghĩa một hàm đệ qui. – day
Tôi sợ call/cc
không thực sự liên quan nhiều đến điều này. Thực sự chỉ có hai cách xác định hàm đệ quy:
- Giả sử ngôn ngữ của bạn cho phép định nghĩa hàm đệ quy; tức là, một cơ quan chức năng có thể tham chiếu đến hàm kèm theo, hoặc phần thân của hàm
f
có thể tham chiếu đến hàmg
có thân thể đề cập đếnf
. Trong trường hợp này, tốt, bạn chỉ cần viết nó theo cách thông thường. - Nếu ngôn ngữ của bạn cấm cả hai, nhưng nó vẫn có chức năng hạng nhất và lambdas, thì bạn có thể sử dụng fixed-point combinator như bộ kết hợp Y. Bạn viết hàm của bạn để nó lấy làm đối số thừa một hàm có nghĩa là đại diện cho bước đệ quy; mọi nơi bạn sẽ tái chế, thay vào đó bạn gọi lập luận đó.
Vì vậy, đối factorial
, bạn viết nó như thế này:
(define (factorial-step recurse n)
(if (zero? n)
1
(* n (recurse (- n 1)))))
Sự kỳ diệu của combinator Y là nó xây dựng các recurse
chức năng đó sẽ được làm thức ăn cho factorial-step
.
- 1. Có thể thực hiện truy vấn SQL đệ quy không?
- 2. Sử dụng truy vấn MySQL phải đi qua hàng để thực hiện một cây đệ quy
- 3. Có thể sử dụng phần tiếp tục để làm cho phần đuôi gập đệ quy không?
- 4. Chức năng này có sử dụng đệ quy đuôi không?
- 5. Ngăn chặn việc thực thi đệ quy đệ quy?
- 6. Thực hiện đệ quy trong các thư mục con
- 7. Viết lại một hàm đệ quy mà không sử dụng đệ quy
- 8. Điều này có thể được thực hiện đuôi đệ quy trong Prolog?
- 9. Tôi có thể thực hiện SELECT đệ quy trong cơ sở dữ liệu T-SQL
- 10. Có thể triển khai at_c không đệ quy không?
- 11. Tôi có thể sử dụng Fabric để thực hiện các lệnh shell tương tác không?
- 12. Hệ số nhị thức sử dụng Đệ quy đệ quy trong LISP
- 13. Đệ quy sử dụng năng suất
- 14. EXC_BAD_ACCESS khi sử dụng khối đệ quy
- 15. Đệ quy đọc thư mục và thực hiện lệnh trên mỗi thư mục
- 16. Có thể đóng cửa đệ quy trong Rust không?
- 17. lệnh di chuyển đệ quy trên windows
- 18. Đệ quy sử dụng danh sách - Haskell
- 19. Đệ quy bằng cách sử dụng AspectJ
- 20. Có một lệnh trình bao để đệ quy cho phép các thư mục và tệp không?
- 21. Có cách nào để thực hiện một công việc ExecutorService đệ quy?
- 22. Sử dụng đệ quy trong C#
- 23. Không đệ quy os.walk()
- 24. Đệ quy đệ quy và đệ quy đệ quy trong Erlang
- 25. Thực hiện cây C++ n-ary để sử dụng trong phân tích cú pháp gốc đệ quy
- 26. Đệ quy đệ quy so với đệ quy trước
- 27. Sử dụng Java ProcessBuilder để thực hiện lệnh đường ống
- 28. Trong clojure, làm thế nào để làm mã templating khi thực hiện một macro bằng cách sử dụng đệ quy
- 29. Phát hiện đệ quy vô hạn?
- 30. Có thể đệ quy các Generics Java giữa hai lớp
Tuyệt vời, chính xác những gì tôi muốn. Cảm ơn rất nhiều. – day
@wberry Tôi đã quyết định tìm một cách để trích dẫn đoạn mã đó hy vọng rằng "sử dụng hợp lý" -hoàn toàn hơn. –
Rất tốt, cảm ơn bạn. – wberry