Głębszy w złożoność funkcji z skontaktowaniem skorupy - część VII

Głębszy w złożoność funkcji z skontaktowaniem skorupy - część VII

Mój poprzedni artykuł na temat „Zrozumienia i pisania funkcji w skontlerze” może dać ci podstawowy pomysł na pisanie funkcji pod skontaktami skorupowymi. Teraz nadszedł czas, aby zagłębiać się w funkcje funkcjonalne, takie jak użycie zmiennych lokalnych i rekurencji.

Złożoność funkcji z skonfrowaniem skorupowym

Zmienne lokalne

Co czyni zmienną lokalną? Zależy to od tego konkretnego bloku, w którym zmienna jest deklarowana. Zmienna zadeklarowana jako lokalny będzie dostępny z tego bloku kodu, gdzie się pojawia.mi. Jego zakres jest lokalny. Aby wyjaśnić tę rzecz.

#!/bin/bash func () lokalny i = 10 j = 20 echo "i from func = $ i" echo "j z func = $ j" echo "i zewnętrzny func = $ i" echo "j outs func = $ J „Func Echo” I Outside Func = $ i „Echo” J Outside Func = $ J ”Exit 0

Po wykonaniu powyższego skryptu wyjście będzie.

I Outside Func = J outside Func = I od func = 10 j od func = 20 i zewnętrzny func = j out func = 20

Jest tak, ponieważ funkcja Func jeszcze nie zadzwonił, póki pierwsze 2 Wykonano instrukcje echo. Po wywołaniu funkcji Func ten sam 2 stwierdzenia ECHO dawać inny wynik. Teraz zmienna J, który został ogłoszony w środku Func i nie można go później uzyskać.

W ten sposób wartość J staje się 20. A co z zmienną lokalną I? Ponieważ jego zakres był w funkcji Func, wartość 10 nie można było uzyskać dostępu z zewnątrz. Zauważ, że zmienna J normalnie zadeklarowane w środku Func Domyślnie jest globalny.

Teraz znasz lokalne zmienne i jak używać ich wewnątrz bloków funkcji. Przejdźmy do najciekawszej sekcji w ramach funkcji, rekurencja.

Co to jest rekurencja?

Funkcja wywołująca sama jest ogólnie określana jako procedura rekurencji. Lub można go zdefiniować jako wyrażanie algorytmu za pomocą prostszej wersji tego samego algorytmu. Rozważ przykład znalezienia liczby czynnikowych. Wiemy to N! = 1 x 2 x 3 x… x (n-1) x n. W ten sposób możemy napisać relację nawrotów jako:

N! = (n-1)! x n

Więc łatwo jest nam rekurencyjnie wywołać tę samą funkcję i użyć wartości zwracania z każdego wywołania, aby pomnożyć z poprzednim wynikiem, i.mi.

5! = 4! x 5 4! = 3! x 4 3! = 2! x 3 2! = 1! x 2 1! = 0! x 1

Rekurencja za pomocą zmiennych lokalnych

Tutaj staramy się napisać skrypt do znalezienia czynnikowy liczby za pomocą zmiennych lokalnych i rekurencji.

#!/bin/bash fact () local num = 1 $, jeśli [$ num -eq 0]; Następnie ret = 1 else temp = $ ((num-1)) fakt $ temp ret = $ ((num*$?)) Fi return $ ret fakt 5 echo "czynnik 5 = $?„Wyjdź 0

num to lokalna zmienna używana do przechowywania każdego n-1 wartość na każdym połączeniu. Tutaj warunek podstawowy sprawdza, czy liczba jest równa zero, czy nie (od 0! = 1 i czynnik nie jest zdefiniowany dla liczb ujemnych). Po przybyciu tego stanu zwraca wartość 1 do swojego dzwoniącego. Teraz num = 1 I ret = 1 x 1.

W tym momencie wraca 1 do swojego dzwoniącego. Teraz num = 2 I ret = 2 x 1 i tak dalej. Wreszcie, kiedy num = 5 Wartość zwracana będzie 24 A końcowy wynik to ret = 5 x 24. Wynik końcowy 120 jest przekazywany do początkowej instrukcji dzwoniącego i jest wyświetlany.

Jest jeden problem w powyższym skrypcie. Jak wyjaśniłem w poprzednim artykule, funkcje nie mogą zwrócić dużych liczb całkowitych. Więc pozostawiono użytkownikom, aby znaleźć rozwiązanie dla powyższego problemu.

Q. Czy możemy wykonać rekurencję bez użycia zmiennych lokalnych? Odpowiedź to Tak.

Rekurencja bez zmiennych lokalnych

Spójrz na poniższy przykład wyświetlania Seria Fibonacci za pomocą rekurencji. Podstawowa relacja nawrotów to:

fib (0) = 0 fib (1) = 1 else fib (n) = fib (n-1) + seria fibonacciego za pomocą rekurencji #!/bin/bash fib () a = 1 $, jeśli [$ a -lt 2]; następnie echo $ a else ((--a)) b = $ (fib $ a) ((--a)) c = $ (fib $ a) echo $ ((b+c)) fi dla i in $ (SEQ 0 15) DO OUT = $ (FIB $ i) Echo $ out Dotar Exit 0

W powyższym skrypcie nie są używane żadne zmienne lokalne. Mam nadzieję, że zrozumiesz przepływ skryptu podczas wykonywania.

Tutaj wartość 15 reprezentuje liczbę terminów w Seria Fibonacci do wyświetlenia. Czy zauważyłeś coś specjalnego dotyczącego wykonania powyższego skryptu. Zajm to trochę czasu, prawda?? Rekurencja w skrypcie jest wolniejsza niż rekurencja w językach programowania, takich jak C.

W tym artykule planuję zakończyć część funkcji w skonstrukcji skorupy. Bądź na bieżąco Tecmint mieć nadchodzące artykuły tablice i wiele więcej…