Linux Shell脚本递归指数化



我正在编写一个脚本,该脚本以2个数字作为输入,并使用递归将数字的幂增加到另一个的幂,即简单的求幂。然而,我是脚本编写的新手,不知道我的语法在哪里出错。

这是的脚本

#!/bin/bash
echo "Enter number: "
read number
echo "Enter power: "
read power
echo "Powering $number to power of $power!" 
exp () {
if [ $2 = 1 ]
then
return $1
fi
return $1 * $(exp $1 $2-1 )
}
result=$(exp $number, $power)
echo "Result: $result"

目前,它有点冻结,我不确定我是否正确使用了参数(在语法方面(。

您需要$(( ))来强制进行算术求值。然后您可以使用返回值进行操作:

number=2 power=7
exp () {
if [ $2 -eq 1 ]; then return $1; fi
exp $1 $(($2-1))
return $(($1 * $?))
}
exp $number $power; result=$?
echo "Result: $result"

但这不是一个好主意,因为shell会保留非零的返回值来传达失败(例如上面的解决方案将"破坏"set -e(。

更习惯的做法是,您可以使用stdout:

set -e
number=2 power=7
exp () {
if [ $2 -eq 1 ]; then echo $1; return; fi
echo $(($1 * $(exp $1 $(($2-1)) ) ))
}
result=$(exp $number $power)
echo "Result: $result"

但所有的潜艇都是低效的。最好避免递归并简单循环:

number=2 power=7
exp () {
local res=1 i=0;
while [ $i -lt $2 ]; do res=$((res*$1)); i=$((i+1)); done
echo $res
}
exp $number $power

最新更新