Nowe posty

xx Zewnętrzna karta wifi (1)
Dzisiaj o 23:32:00
xx sieć domowa - zepsuty nautilus (1)
Dzisiaj o 16:25:24
xx Skrypt ubijający usługę (3)
Dzisiaj o 08:10:21
xx Laptop się nie wyłącza (31)
Wczoraj o 14:07:21
xx [ROZWIĄZANY] partycjonowanie dla brtfs (7)
2018-06-15, 17:10:26
xx [SOLVED] X Server nie działa po aktualizacji pakietów... (11)
2018-06-13, 23:41:25
xx [ Gra Za Darmo przez okreslony czas ] Ziggurat (0)
2018-06-12, 18:17:28
xx Linux Mint 19.Beta (18)
2018-06-09, 18:48:16
xx Streamowanie pulpitu i gier linux ubuntu na android (9)
2018-06-09, 17:38:36
xx zrobmikompa.pl - co myślicie o tej stronce (6)
2018-06-09, 16:42:47

Autor Wątek: Funkcja rekursywna  (Przeczytany 539 razy)

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 1916
  • 1709
    • Zobacz profil
Funkcja rekursywna
« dnia: 2017-11-13, 14:01:26 »
Probuje zrozumiec dzialanie funkcji rekursywnej / rekurencyjnej.

https://bash.cyberciti.biz/guide/Recursive_function

#!/bin/bash
# fact.sh - Shell script to to find factorial of given command line arg
factorial(){
  local i=$1
  local f
  declare -i i
  declare -i f
 
  # factorial() is called until the value of $f is returned and is it is <= 2
  # This is called the recursion
  [ $i -le 2 ] && echo $i || { f=$(( i - 1)); f=$(factorial $f); f=$(( f * i )); echo $f; }
}


# display usage
[ $# -eq 0 ] && { echo "Usage: $0 number"; exit 1; }

# call factorial
factorial $1

i

#!/bin/bash


# fact.sh - Shell script to to find factorial of given command line arg
factorial(){
  local i=$1
  local f
  declare -i i
  declare -i f
 
  # factorial() is called until the value of $f is returned and is it is <= 2
  # This is called the recursion
    if [ $1 -lt 5 ]
    then
        echo $1
        factorial $(($1 + 1)) ; echo $1
       # echo $x
    fi
}


# display usage
[ $# -eq 0 ] && { echo "Usage: $0 number"; exit 1; }

# call factorial
factorial $1

Czemu przy debugowaniu ten pierwszy ma kolejny dodatkowy plus przy uruchamianiu kolejnej funkcji, a ten dolny nie ?
$ bash -x ./t3 4
+ '[' 1 -eq 0 ']'
+ factorial 4
+ local i=4
+ local f
+ declare -i i
+ declare -i f
+ '[' 4 -le 2 ']'
+ f=3
++ factorial 3
++ local i=3
...

$ bash -x ./t2 1
+ '[' 1 -eq 0 ']'
+ factorial 1
+ local i=1
+ local f
+ declare -i i
+ declare -i f
+ '[' 1 -lt 5 ']'
+ echo 1
1
+ factorial 2
+ local i=2
+ local f
+ declare -i i
+ declare -i f
+ '[' 2 -lt 5 ']'
+ echo 2
2
...
Pochwal się swoją kartą graficzną w tym wątku-->
http://forum.linux.pl/index.php/topic,19841.msg121122.html#msg121122

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 2358
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
    • Linuxpedia.PL
Odp: Funkcja rekursywna
« Odpowiedź #1 dnia: 2017-11-13, 15:46:34 »
W pierwszym przypadku masz wywołanie rekursywne całego shella (każdy plus to kolejne zaglębienie wywołania)

W drugim przypadku masz wywołanie rekursywne w obrębie tego samego shella (czyli cały czas na tym samym zaglębienia wywołania shella).
Paweł Kraszewski
~Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 1916
  • 1709
    • Zobacz profil
Odp: Funkcja rekursywna
« Odpowiedź #2 dnia: 2017-11-13, 16:00:54 »
Dziekuje.
Pochwal się swoją kartą graficzną w tym wątku-->
http://forum.linux.pl/index.php/topic,19841.msg121122.html#msg121122