Zastanawiam się, czy możliwe jest zdefiniowanie funkcji rekursywnej bez wywoływania samej funkcji w jej ciele, ale w jakiś sposób za pomocą wywołania/cc zamiast tego? Dzięki.Czy można użyć wywołania/cc do implementacji rekursji?
Odpowiedz
Można zastosować kombinator Y przy użyciu call/cc
, as described here. (! Wiele dzięki John Cowan dla wspomnieć Ten gustowny post) Cytowanie tego posta, oto realizacja Olega:
WNIOSEK 1. Y combinator poprzez
call/cc
- Y Combinator bez wyraźnego samodzielnego stosowania.(define (Y f) ((lambda (u) (u (lambda (x) (lambda (n) ((f (u x)) n))))) (call/cc (call/cc (lambda (x) x)))))
Tutaj użyliśmy fakt
((lambda (u) (u p)) (call/cc call/cc))
i
((lambda (u) (u p)) (lambda (x) (x x)))
są obserwacyjnie równoważne.
Twoje pytanie jest nieco niejasne. W szczególności brzmi to tak, jakbyś chciał systemu, który modeluje wywołania rekursywne bez wykonywania bezpośrednio wywołań rekursywnych, za pomocą połączenia/cc. Okazuje się jednak, że można modelować wywołania rekursywne bez wykonywania wywołań rekursywnych i również bez użycia połączenia/cc. Na przykład:
#lang racket
(define (factorial f n)
(if (= n 0) 1 (* n (f f (- n 1)))))
(factorial factorial 3)
To może wydawać się oszustwem, ale jest podstawą kombinatora Y. Być może możesz zaostrzyć zestaw ograniczeń, o których myślisz?
P.S .: jeśli to praca domowa, proszę zacytuj mnie!
Cóż, już znałem tę sztuczkę do rekursji. Zastanawiam się, czy istnieje sposób niezależny od używania call/cc do zdefiniowania funkcji rekursywnej, powiedzmy 'factorial'. To nie jest ćwiczenie domowe! Dzięki. – day
@plmday Rozwiązanie Johna już nie jest samoindeksujące. Czego więcej potrzebujesz od 'call/cc'? –
@ SamTobin-Hochstadt Cóż, to znaczy, 'f' odnosi się do siebie, czyż nie?Chcę zobaczyć, jak daleko możemy się posunąć za pomocą 'call/cc', w szczególności, biorąc pod uwagę jego zdolność, możemy użyć go do symulacji zwykłego lub niecodziennego sposobu definiowania funkcji rekursywnej. – day
Obawiam się, że call/cc
tak naprawdę nie ma wiele wspólnego z tym. Istnieją naprawdę tylko dwa sposoby definiowania funkcji rekursywnej:
- Załóżmy, że twój język pozwala na definicje funkcji rekursywnych; to znaczy, że korpus funkcji może odnosić się do funkcji otaczającej, lub ciało funkcji może odnosić się do funkcji, która odnosi się do . W takim przypadku, po prostu zapisz to w zwykły sposób.
- Jeśli twój język zabrania obu tych funkcji, ale nadal ma funkcje pierwszej klasy i lambdy, możesz użyć kombinacji fixed-point combinator, takiej jak kombinator Y. Piszecie swoją funkcję, aby jako dodatkowy argument przyjąć funkcję, która ma reprezentować etap rekursywny; w każdym miejscu, w którym powracasz, zamiast tego przywołujesz ten argument.
Więc dla factorial
, piszesz to tak:
(define (factorial-step recurse n)
(if (zero? n)
1
(* n (recurse (- n 1)))))
Magia combinator Y jest to, że tworzy funkcję recurse
który byłby podawany do factorial-step
.
- 1. Czy można użyć XmlAttributes do selektywnej XmlIgnore?
- 2. Czy można użyć jQuery do odczytania metatagów?
- 3. Jak mogę poprawić możliwości rekursji mojej implementacji ECMAScript?
- 4. Czy można zmienić listę w zagnieżdżony dyktat kluczy * bez * rekursji?
- 5. Czy istnieje limit rekursji w seplenienie?
- 6. znajdowanie bez rekursji
- 7. Kliknięcie do implementacji
- 8. Czy istnieje kolejka implementacji?
- 9. Czy można użyć losowego identyfikatora tekstury?
- 10. Czy można użyć przeglądarki internetowej bez pakowania?
- 11. Czy można użyć django_compressor/S3/gzip?
- 12. Czy można użyć counter_cache z has_many?
- 13. Czy można użyć JAXB do odwzorowania ze schematu na java.util.Map?
- 14. Czy można użyć animacji klatek kluczowych do pseudoelementu?
- 15. Czy można użyć wyrażenia regularnego do mapowania serwletu Jetty?
- 16. Czy można użyć poprzedniego parametru funkcji do zadeklarowania nowego?
- 17. Czy można użyć constructor.name do wykrywania typów w JavaScript
- 18. Czy można użyć narzędzia Firebase RemoteConfig do przechowywania kluczy API?
- 19. Czy można użyć Twitter Bootstrap do stworzenia strony Magento?
- 20. Czy można użyć PowerMocka do fałszywego tworzenia nowego pliku?
- 21. Czy do kliknięcia przycisku angularjs można użyć powershell?
- 22. Czy można użyć MEF RegistrationBuilder do utworzenia modułu PRISM ModuleExport?
- 23. Czy można użyć SQL do wybrania wartości z tablicy JSON?
- 24. Czy można użyć odbicia z linq do encji?
- 25. Czy można użyć funkcji gmock do skrótów funkcji C?
- 26. Czy mogę użyć StructureMap do zwrócenia wszystkich implementacji interfejsu ogólnego dla określonego parametru typu
- 27. Czy istnieje serwer autoryzacji, którego mogę użyć do przetestowania implementacji klienta OAuth 2.0?
- 28. Funkcja dodawania listy rekursji ogonowej
- 29. Czy można użyć menedżera LoaderManager z usługi?
- 30. Czy można użyć ratunku z warunkowym?
Niesamowite, dokładnie to, co chcę. Wielkie dzięki. – day
@wberry Postanowiłem znaleźć sposób na zacytowanie tego fragmentu kodu, który, mam nadzieję, będzie bardziej zgodny z zasadami "dozwolonego użytku". –
Bardzo dobrze, dziękuję. – wberry