Adding with_trampoline function
This commit is contained in:
parent
cb9eff8b81
commit
b5a3c9eea0
2 changed files with 63 additions and 2 deletions
|
@ -117,4 +117,43 @@ echo 0 | cat - <(curl -s https://raw.githubusercontent.com/ssledz/bash-fun/v1.1.
|
|||
map lambda a . 'list $a' | foldl lambda acc el . 'echo $(($acc + 1))'
|
||||
|
||||
echo 0 | cat - <(curl -s curl -s https://raw.githubusercontent.com/ssledz/bash-fun/v1.1.1/src/fun.sh) \
|
||||
| foldl lambda acc el . 'echo $(($acc + 1))'
|
||||
| foldl lambda acc el . 'echo $(($acc + 1))'
|
||||
|
||||
|
||||
factorial() {
|
||||
fact_iter() {
|
||||
local product=$1
|
||||
local counter=$2
|
||||
local max_count=$3
|
||||
if [[ $counter -gt $max_count ]]; then
|
||||
echo $product
|
||||
else
|
||||
fact_iter $(echo $counter\*$product | bc) $(($counter + 1)) $max_count
|
||||
fi
|
||||
}
|
||||
|
||||
fact_iter 1 1 $1
|
||||
}
|
||||
|
||||
factorial_trampoline() {
|
||||
fact_iter() {
|
||||
local product=$1
|
||||
local counter=$2
|
||||
local max_count=$3
|
||||
if [[ $counter -gt $max_count ]]; then
|
||||
res $product
|
||||
else
|
||||
call fact_iter $(echo $counter\*$product | bc) $(($counter + 1)) $max_count
|
||||
fi
|
||||
}
|
||||
|
||||
with_trampoline fact_iter 1 1 $1
|
||||
}
|
||||
|
||||
echo Factorial test
|
||||
|
||||
time factorial 30
|
||||
time factorial_trampoline 30
|
||||
|
||||
time factorial 60
|
||||
time factorial_trampoline 60
|
24
src/fun.sh
24
src/fun.sh
|
@ -242,7 +242,7 @@ zip() {
|
|||
done
|
||||
}
|
||||
|
||||
function curry() {
|
||||
curry() {
|
||||
exportfun=$1; shift
|
||||
fun=$1; shift
|
||||
params=$*
|
||||
|
@ -253,3 +253,25 @@ function curry() {
|
|||
eval $cmd
|
||||
}
|
||||
|
||||
with_trampoline() {
|
||||
local f=$1; shift
|
||||
local args=$@
|
||||
while [[ $f != 'None' ]]; do
|
||||
ret=$($f $args)
|
||||
# echo $ret
|
||||
f=$(tupl $ret)
|
||||
args=$(echo $ret | tupx 2- | tr ',' ' ')
|
||||
done
|
||||
echo $args
|
||||
}
|
||||
|
||||
res() {
|
||||
local value=$1
|
||||
tup "None" $value
|
||||
}
|
||||
|
||||
call() {
|
||||
local f=$1; shift
|
||||
local args=$@
|
||||
tup $f $args
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue