Jinle sinu Awọn idiwọn Iṣẹ pẹlu Ikarahun Ikarahun - Apakan VII


Nkan mi ti tẹlẹ lori\"Oye ati kikọ awọn iṣẹ ni Awọn iwe afọwọkọ Shell" le ti fun ọ ni imọran ipilẹ lori bi o ṣe le kọ awọn iṣẹ labẹ awọn iwe afọwọkọ ikarahun. Bayi o to akoko lati jinle si awọn ẹya ti iṣẹ bi lilo awọn oniyipada agbegbe ati ipadasẹhin.

Kini o jẹ ki agbegbe iyipada kan? O da lori bulọki yẹn pato nibiti a ti kede oniyipada naa. Oniyipada kan ti a kede bi agbegbe yoo jẹ iraye si lati bulọọki koodu naa nibiti o ti han ie iwọn rẹ jẹ ti agbegbe. Lati le ṣalaye nkan yii jẹ ki a wo apẹẹrẹ kan ni isalẹ.

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

Lori pipaṣẹ iwe afọwọkọ loke iṣẹjade yoo jẹ.

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

Eyi jẹ nitori iṣẹ naa func ko tii pe lakoko ti a pa awọn alaye iwoyi akọkọ 2. Lẹhin pipe iṣẹ naa func awọn alaye iwoyi kanna kanna ṣe abajade ti o yatọ. Bayi oniyipada j , eyiti o kede ni inu func ati kii ṣe agbegbe, le ti wọle si lẹhinna.

Bayi iye fun j di 20. Kini nipa oniyipada agbegbe i ? Niwon ibiti o ti wa ni inu iṣẹ naa func , a ko le wọle si iye 10 lati ita. Akiyesi pe oniyipada j deede kede ninu func jẹ agbaye nipasẹ aiyipada.

Bayi o faramọ pẹlu awọn oniyipada agbegbe ati bii o ṣe le lo wọn ninu awọn bulọọki iṣẹ. Jẹ ki a lọ siwaju si apakan ti o nifẹ julọ julọ labẹ awọn iṣẹ, ipadasẹhin.

Iṣẹ kan ti o n pe ararẹ ni a pe ni gbogbogbo gẹgẹbi ilana ipadasẹhin. Tabi o le ṣalaye bi ṣalaye alugoridimu kan nipa lilo ẹya ti o rọrun julọ ti algorithm kanna. Wo apẹẹrẹ ti wiwa itan-ọrọ ti nọmba kan. A mọ pe n! = 1 x 2 x 3 x… x (n-1) x n. Nitorinaa a le kọ ibatan ibatan bi:

n! = (n-1)! x n

Nitorinaa o rọrun fun wa lati tun pe iṣẹ kanna ni recursively ati lo iye ipadabọ lati ipe kọọkan lati pọ si pẹlu abajade ti tẹlẹ, i.e.

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

Nibi a gbiyanju lati kọ iwe afọwọkọ kan fun wiwa otitọ ti nọmba kan nipa lilo awọn oniyipada agbegbe ati ipadasẹhin.

#!/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 jẹ oniyipada agbegbe ti a lo lati tọju iye n-1 kọọkan lori ipe kọọkan. Nibi ipo ipilẹ n ṣayẹwo boya nọmba naa dọgba si odo tabi rara (nitori 0! = 1 ati ọrọ gangan ko ṣe alaye fun awọn nọmba odi). Nigbati o de ipo ipilẹ yii o pada iye 1 si olupe rẹ. Bayi num = 1 ati ret = 1 x 1 .

Ni akoko yii o pada 1 si olupe rẹ. Bayi num = 2 ati ret = 2 x 1 ati bẹbẹ lọ. Lakotan nigbati num = 5 iye pada yoo jẹ 24 ati abajade ikẹhin ni ret = 5 x 24 . Abajade ikẹhin 120 ti kọja si alaye olupe akọkọ ati pe o han.

Iṣoro kan wa ninu iwe afọwọkọ loke. Gẹgẹbi Mo ti ṣalaye ninu nkan ti tẹlẹ, awọn iṣẹ ko le da awọn nomba nla pada. Nitorinaa osi rẹ si awọn olumulo lati wa ojutu kan fun ọrọ ti o wa loke.

Q. Njẹ a le ṣe ifasẹyin laisi lilo awọn oniyipada agbegbe? Idahun ni Bẹẹni.

Wo apẹẹrẹ atẹle fun iṣafihan jara Fibonacci nipa lilo ifasẹyin. Ibasepo isọdọtun ipilẹ ni:

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

Ko si awọn oniyipada agbegbe ti o lo ninu iwe afọwọkọ ti o wa loke. Mo nireti pe o le ni oye ṣiṣan ti iwe afọwọkọ lakoko ipaniyan.

Nibi iye 15 duro fun nọmba awọn ọrọ ninu jara Fibonacci lati han. Njẹ o ṣe akiyesi ohunkohun pataki nipa ipaniyan ti iwe afọwọkọ loke. Yoo gba igba diẹ, ṣe kii ṣe bẹẹ? Idapada ninu iwe afọwọkọ jẹ o lọra ju ipadasẹhin ninu awọn ede siseto bii C.

Pẹlu nkan yii, Mo gbero lati pari apakan awọn iṣẹ inu iwe afọwọkọ ikarahun. Wa ni imudojuiwọn pẹlu Tecmint lati ni awọn nkan ti n bọ lori awọn ipilẹ ati pupọ diẹ sii…