-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathfib.sh
executable file
·49 lines (45 loc) · 901 Bytes
/
fib.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/bin/sh
set -e -u -f
LC_ALL=C
: $((__t2 = __t1 = n = 0))
_fib() { let n $2
let __t1; let __t2
if [ $n -lt 2 ] ; then
: $(($1 = n))
else
_fib __t1 $((n - 1))
_fib __t2 $((n - 2))
: $(($1 = __t1 + __t2))
fi
endlet $1 __t2 __t1 n
}
: $((i = n = 0))
_main() {
let n; let i
i=0
while [ $i -lt 20 ]; do
_fib n $i
printf "fib(%d) = %d\n" $i $n
: $((i += 1))
done
endlet $1 i n
}
# Runtime library
# Local variables
__=0
__SP=0
let() { # $1: variable name, $2: value (optional)
: $((__SP += 1)) $((__$__SP=$1)) # Push
: $(($1=${2-0})) # Init
}
endlet() { # $1: return variable
# $2...: function local variables
__ret=$1 # Don't overwrite return value
: $((__tmp = $__ret))
while [ $# -ge 2 ]; do
: $(($2 = __$__SP)) $((__SP -= 1)); # Pop
shift;
done
: $(($__ret=__tmp)) # Restore return value
}
_main __