Zurfafa cikin Abubuwan Abubuwan Aiki tare da Rubutun Shell - Sashe na VII


Labari na da ya gabata akan \Fahimta da Ayyukan Rubutu a cikin Rubutun Shell na iya ba ku ainihin ra'ayi kan yadda ake rubuta ayyuka a ƙarƙashin rubutun harsashi. Yanzu lokaci ya yi da za ku zurfafa cikin fasalulluka na aiki kamar amfani da masu canji na gida da maimaitawa.

Me ke sa mai canzawa na gida? Ya dogara da wannan ƙayyadaddun toshe inda aka ayyana mai canzawa. Za a iya samun dama ga maɓalli da aka bayyana a matsayin local daga wannan katangar lambar inda ta bayyana watau iyakarta na gida ne. Domin bayyana wannan abu bari mu dubi misali daya a kasa.

#!/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

A kan aiwatar da rubutun da ke sama fitarwa zai kasance.

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

Wannan saboda aikin func bai riga ya kira ba yayin da aka aiwatar da bayanan echo 2 na farko. Bayan kiran aikin func maganganun echo guda 2 iri ɗaya suna haifar da sakamako daban. Yanzu ana iya samun dama ga mj, wanda aka bayyana a cikin func kuma ba na gida ba, daga baya.

Don haka ƙimar j ta zama 20. Me game da mabambantan gida i? Tun da iyakarsa yana cikin aikin func, ƙimar 10 ba za a iya isa gare shi daga waje ba. Lura cewa madaidaicin j da aka saba bayyana a cikin func na duniya ne ta tsohuwa.

Yanzu kun saba da masu canjin gida da yadda ake amfani da su a cikin tubalan ayyuka. Bari mu matsa zuwa sashin da ya fi ban sha'awa a ƙarƙashin ayyuka, maimaitawa.

Aiki da yake kiran kansa gabaɗaya ana kiransa azaman hanyar maimaitawa. Ko kuma ana iya bayyana shi azaman bayyana algorithm ta amfani da sigar mafi sauƙi na wannan algorithm iri ɗaya. Yi la'akari da misalin nemo ma'auni na lamba. Mun san cewa n! = 1 x 2 x 3 x… x (n-1) x n. Don haka za mu iya rubuta alaƙar maimaituwa kamar:

n! = (n-1)! x n

Don haka yana da sauƙi a gare mu mu sake kiran aiki iri ɗaya kuma mu yi amfani da ƙimar dawowa daga kowane kira don ninka tare da sakamakon da ya gabata, watau.

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

Anan muna ƙoƙarin rubuta rubutun don nemo maɓalli na lamba ta amfani da masu canji na gida da maimaitawa.

#!/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 madaidaicin gida ne da ake amfani da shi don adana kowane ƙimar n-1 akan kowane kira. Anan yanayin tushe yana bincika ko lambar tana daidai da sifili ko a'a (tun 0! = 1 kuma ba a bayyana ma'auni don lambobi mara kyau ba). Lokacin isa wannan yanayin tushe yana mayar da ƙimar 1 ga mai kiran sa. Yanzu num = 1da ret = 1 x 1.

A nan take zai dawo 1 ga mai kiransa. Yanzu num = 2 da ret = 2 x 1da sauransu. A ƙarshe lokacin da num = 5 ƙimar dawowa zai zama 24 kuma sakamakon ƙarshe shine ret = 5 x 24. Sakamakon ƙarshe na 120 an ƙaddamar da shi zuwa bayanin mai kiran farko kuma yana nunawa.

Akwai matsala ɗaya a cikin rubutun da ke sama. Kamar yadda na bayyana a cikin labarin da ya gabata, ayyuka ba za su iya dawo da manyan lambobi ba. Don haka hagu ga masu amfani don nemo mafita ga batun da ke sama.

Q. Shin za mu iya yin maimaitawa ba tare da amfani da masu canjin gida ba? Amsa ita ce E.

Dubi misali mai zuwa don nuna jerin Fibonacci ta amfani da recursion. Asalin dangantakar maimaituwa ita ce:

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

Babu masu canji na gida da aka yi amfani da su a cikin rubutun da ke sama. Ina fatan za ku iya fahimtar kwararar rubutun yayin aiwatarwa.

Anan ƙimar 15 tana wakiltar adadin sharuɗɗan a cikin jerin Fibonacci da za a nuna. Shin kun lura da wani abu na musamman game da aiwatar da rubutun na sama. Yana ɗaukar ɗan lokaci, ko ba haka ba? Maimaitawa a cikin rubutun yana da hankali fiye da maimaituwa a cikin yarukan shirye-shirye kamar C.

Da wannan labarin, na yi shirin ƙare sashin ayyuka a rubutun harsashi. Kasance da sabuntawa tare da Tecmint don samun labarai masu zuwa akan tsararru da ƙari mai yawa…