2012-01-26 7 views
5

W ciągu ostatnich kilku miesięcy podskakiwałem w językach funkcyjnych od F # do Haskella do Schematu (rakieta). Nigdy tak naprawdę nie użyłem rekursji, ale Haskell i jego dopasowanie do wzoru naprawdę pomogło mi się mniej bać. Teraz, kiedy używam Schematu, domyślam się metod rekursywnych. Jestem ciekawy, czy to wskazuje na "ooo shiny!" faza lub rekursja jest podstawą rozwoju Schematu.Nowość w Schemacie/Racket: Ciężkie użycie rekurencji w stylu życia lub przechodzę przez typową fazę

Nota boczna: Fotografowałem rekurencję ogona za każdym razem, gdy piszę metody rekursywne.

Odpowiedz

10

Myślę, że to zależy od rodzaju rekurencji, o której mówisz.

Pierwszym otwieraczem do oczu (na przykład podczas pracy z SICP) jest to, że iterację można zastąpić rekurencją. Wszystkie te wiersze nudnego i podatnego na błędy kodu pętlowego, który napisałeś w poprzednim życiu, można zrobić w inny sposób. To jest fajne i (jak to określasz) "ooh shiny!" doświadczenie.

Następnym okiem jest to, jak mało z tegojest kod rekurencyjny, który faktycznie napiszesz w prawdziwym życiu. Zamiast tego unikniesz żmudnej iteracji - i żmudnej rekursji, obie - używając bloków takich jak map i fold.

Ponadto w Racket prawdopodobnie będziesz ukończyć map i fold do preferując „listowych” jak for/list, for/vector i for/fold że prace nad sekwencjami nie tylko wymienia. Do łańcucha pokarmowego idziesz dalej.

Powiedziawszy to, są pewne problemy, które najlepiej rozwiążesz rekursywnie (nie tylko "iteracja w inny sposób"). I myślę, że poziom komfortu, jaki uzyskałeś w pierwszej klasie oczu, pomoże.

+1

+1 Nauka używania - i ostatecznie rozwijania własnych - funkcji wyższego rzędu jest zdecydowanie kolejnym "Ooh shiny!" krok, który powinieneś zażywać. Potem może są to monady i strzały. –

3

Po trochu każdego. Rekursja jest podstawą Lispa w ogóle (nie tylko Schematu). Bardziej zaawansowani użytkownicy często jednak częściej korzystają z innych prymitywów sterowania przepływem (choć mogą one z kolei być rekurencyjnie realizowane).

5

Nie, to nie faza, to jest podstawa. Rekursja to technika, która pozwala rozwiązywać bardziej złożone problemy, niż gdybyś był w stanie poradzić sobie z łatwością - a nawet w przypadkach, gdy potrzebujesz rozwiązania iteracyjnego, łatwiej jest do niego dojść, jeśli najpierw sformułujesz rekurencję.

Mastering rekursji otwiera również nowe obszary problemowe dla Ciebie. Typowi iteracyjni programiści nie są przygotowani do radzenia sobie z problemami, które obejmują na przykład manipulowanie i tłumaczenie między językami formalnymi, jak np. Pisanie złożonych generatorów kwerend SQL na podstawie kodowanego opisu raportu, który użytkownik chce zobaczyć. .

Jeśli chcesz posuwać się do przodu, powinieneś zająć się bardziej złożonymi fałdami, które abstrakcyjne oddalają się od wyraźnej rekursji, oddzielając rekurencyjną strukturę obliczeń od zawartości kroków rekursywnych. Na przykład schemat fold-right może być postrzegany jako "wykonywanie obliczeń rekursywnych, które mają ten sam kształt co ta lista, mapowanie pustej listy na tę wartość jako podstawową, a każdą cons dla tej funkcji." Następnie są fałdy na innych, bardziej złożonych strukturach danych.

Powiązane problemy