Programowanie w Shellu (index)


Programowanie w Shellu (10) - rekurencja

ZADANIE 10.1

Stworzyć plik fibonacci.sh postaci:


#!/bin/bash
#
# fibonacci.sh
#
# Wyliczanie elementow ciagu Fibonacciego:
# a_1=0, a_2=1, a_{n+2}=a_{n+1}+a_{n}
# Wynik wyprowadzany przez echo na stdout (zalecane).

fibonacci() {
# Sprawdzenie, czy podany jest pierwszy argument
if [ -z "$1" ]; then
    echo "Syntax: fibonacci LICZBA" >& 2
    return 1
fi

local MINUS1
local MINUS2
# Warunek wyjscia sluzacy do przerwania rekurencji
if [ $1 -gt 2 ]; then
# Ponowne wywolanie funkcji z mniejszymi liczbami
    MINUS1=$(fibonacci $(($1-1)) )
    MINUS2=$(fibonacci $(($1-2)) )
    echo $((MINUS1+MINUS2))
elif [ $1 -eq 2 ]; then
    echo "1"
elif [ $1 -eq 1 ]; then
    echo "0"
else
    echo "fibonacci: Podano liczbe mniejsza od 1" >& 2
    return 1
fi
return 0
}

# Sprawdzanie ciagu Fibonacciego.
KONIEC=10
LICZNIK=1
while [ ${LICZNIK} -le ${KONIEC} ]
do
    echo -n "Fibonacci( ${LICZNIK} )= "
    fibonacci ${LICZNIK}
    let "LICZNIK=LICZNIK+1"
done
exit 0

Uruchomić skrypt poleceniem: ./fibonacci.sh

Poprawić skrypt, aby prosił użytkownika o podanie numeru, dla którego będzie obliczona wartość ciągu Fibonacciego.

ZADANIE 10.2

Stworzyć plik suma4.sh postaci:


#!/bin/bash
#
# suma4.sh
#
# Sumowanie przez rekurencje.

# Wynik wyprowadzany przez echo na stdout (zalecane).
# Sumuje liczby od najwyzszej!
suma4a() {
# Sprawdzenie, czy podane sa dwa argumenty
if [ $# -ne 2 ] ; then
    echo "Syntax: suma4a LICZBA1 LICZBA2" >& 2
    return 1
fi
local TOTAL
# Warunek wyjscia sluzacy do przerwania rekurencji
if [ $1 -lt $2 ]; then
# Ponowne wywolanie funkcji z nastepna liczba
    TOTAL=$(suma4a $(($1+1)) $2)
# Zsumowanie wartosci zwracanej z biezacym $1
    let "TOTAL=TOTAL+$1"
    echo ${TOTAL}            # Zwrot nowej sumy
else
    echo $2              # Zwrot $2 po wszystkich wywolaniach
fi
return 0
}

# Wynik to kod powrotu, ktory moze byc odebrany przez $?.
# Sumuje liczby od najwyzszej!
suma4b() {
# Sprawdzenie, czy podane sa dwa argumenty
if [ $# -ne 2 ] ; then
    echo "Syntax: suma4b LICZBA1 LICZBA2" >& 2
    return 1
fi
# Warunek wyjscia sluzacy do przerwania rekurencji
if [ $1 -lt $2 ]; then
# Ponowne wywolanie funkcji z nastepna liczba
    suma4b $(($1+1)) $2
# Zsumowanie wartosci zwracanej z biezacym $1
    TOTAL=$(($?+$1))
    return ${TOTAL}       # Zwrot nowej sumy
else
    return $2              # Zwrot $2 po wszystkich wywolaniach
fi
}

# Sprawdzanie sumowania liczb roznymi metodami.
# KONIEC=23 i wiecej daje bledny wynik (kod powrotu powyzej 255)
START=1
KONIEC=10
echo -n "Suma liczb od ${START} do ${KONIEC} (rekurencja, echo): "
suma4a ${START} ${KONIEC}
echo -n "Suma liczb od ${START} do ${KONIEC} (rekurencja, return): "
suma4b ${START} ${KONIEC}
echo $?
exit 0

Uruchomić skrypt poleceniem: ./suma4.sh

Poprawić skrypt, aby prosił użytkownika o podanie wartości zmiennych START i KONIEC.

METODY WPROWADZANIA DANYCH DO SKRYPTU


Programowanie w Shellu (index)