Globlje v zapletenost funkcij s skriptiranjem lupine - VII. Del


Moj prejšnji članek o\"Razumevanje in pisanje funkcij v skriptih lupine" vam je morda dal osnovno idejo o tem, kako zapisovati funkcije pod lupinskimi skripti.

Kaj naredi spremenljivko lokalno? Odvisno od tega bloka, kjer je spremenljivka deklarirana. Spremenljivka, prijavljena kot lokalna , bo dostopna iz tistega bloka kode, kjer je videti, tj. Njen obseg je lokalni. Da bi to pojasnili, si oglejmo en primer spodaj.

#!/bin/bash 

func( ) { 
	local i=10 
	j=20 
	echo "i from func = $i" 
	echo "j from func = $j" 
} 

echo "i outside func = $i" 
echo "j outside func = $j" 

func 

echo "i outside func = $i" 
echo "j outside func = $j" 

exit 0

Ob izvedbi zgornjega skripta bo rezultat.

i outside func = 
j outside func = 
i from func = 10 
j from func = 20 
i outside func = 
j outside func = 20

To je zato, ker funkcija func še ni poklicala, ko sta bila izvedena prva 2 stavka odmeva. Po klicu funkcije func isti dve stavki odmeva povzročita drugačen rezultat. Zdaj bi lahko pozneje dostopali do spremenljivke j , ki je bila razglašena znotraj func in ni lokalna.

Tako vrednost za j postane 20. Kaj pa lokalna spremenljivka i ? Ker je bil njen obseg znotraj funkcije func , do vrednosti 10 ni bilo mogoče dostopati od zunaj. Upoštevajte, da je spremenljivka j , ki je običajno deklarirana znotraj func , privzeto globalna.

Zdaj poznate lokalne spremenljivke in kako jih uporabljati znotraj funkcijskih blokov. Pojdimo na najbolj zanimiv odsek pod funkcijami, rekurzija.

Funkcija, ki sama kliče, se običajno imenuje rekurzijski postopek. Lahko pa ga definiramo kot izražanje algoritma z uporabo preprostejše različice istega algoritma. Poglejmo primer iskanja faktorja števila. Vemo, da n! = 1 x 2 x 3 x… x (n-1) x n. Tako lahko relacijo ponovitve napišemo kot:

n! = (n-1)! x n

Tako nam je enostavno rekurzivno poklicati isto funkcijo in uporabiti vrnjeno vrednost iz vsakega klica za množenje s prejšnjim rezultatom, tj.

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

Tu poskušamo napisati skript za iskanje faktorijela števila z uporabo lokalnih spremenljivk in rekurzije.

#!/bin/bash 

fact( ) { 
	local num=$1 
	if [ $num -eq 0 ]; then 
		ret=1 
	else 
		temp=$((num-1)) 
		fact $temp 
		ret=$((num*$?)) 
	fi 
	return $ret 
} 

fact 5 

echo "Factorial of 5 = $?" 

exit 0

num je lokalna spremenljivka, ki se uporablja za shranjevanje vsake vrednosti n-1 za vsak klic. Tu osnovni pogoj preveri, ali je število enako nič ali ne (saj je 0! = 1 in faktorji niso določeni za negativna števila). Ko prispe ta osnovni pogoj, vrne vrednost 1 klicatelju. Zdaj num = 1 in ret = 1 x 1 .

V tem trenutku se vrne 1 klicatelju. Zdaj num = 2 in ret = 2 x 1 itd. Končno, ko bo num = 5 vrnjena vrednost 24, končni rezultat pa ret = 5 x 24 . Končni rezultat 120 se posreduje v začetni stavek klicatelja in se prikaže.

V zgornjem skriptu je ena težava. Kot sem pojasnil v prejšnjem članku, funkcije ne morejo vrniti velikih celih števil. Tako je prepuščeno uporabnikom, da najdejo rešitev za zgornjo težavo.

V. Ali lahko izvedemo rekurzijo brez uporabe lokalnih spremenljivk? Odgovor je Da.

Oglejte si naslednji primer za prikaz Fibonaccijeve serije z uporabo rekurzije. Osnovna relacija ponovitve je:

fib(0) = 0 
fib(1) = 1 
else 
	fib(n) = fib(n-1) + fib(n-2)

Fibonacci series using recursion

#!/bin/bash 

fib( ) { 
	a=$1 
	if [ $a -lt 2 ]; then 
		echo $a 
	else 
		((--a)) 
		b=$(fib $a) 

		((--a)) 
		c=$(fib $a) 

		echo $((b+c)) 
	fi 
} 

for i in $(seq 0 15) 
do 
	out=$(fib $i) 
	echo $out 
done 

exit 0

V zgornjem skriptu niso uporabljene nobene lokalne spremenljivke. Upam, da lahko razumete tok skripta med izvajanjem.

Tu vrednost 15 predstavlja število izrazov v Fibonaccijevi seriji, ki bodo prikazani. Ste opazili kaj posebnega v zvezi z izvajanjem zgornjega skripta. Traja nekaj časa, kajne? Rekurzija v skriptu je počasnejša od rekurzije v programskih jezikih, kot je C.

S tem člankom nameravam zaključiti funkcijski del pri skriptiranju lupine. Bodite na tekočem s Tecmintom, da boste imeli prihajajoče članke o nizih in še veliko več ...