如何递归找到数字总和

时间:2019-05-06 22:26:59

标签: bash shell

我需要递归地找到shell中的数字总和。但我有一个错误: 第10行:5 +:语法错误:应为操作数(错误标记为“ +”)

function countofnumbers
{
    if [ $1 -lt 10 ]
    then
        return $1
    else
        let z=$1/10
        let result=expr`$(($(( $1 % 10 )) + $(countofnumbers $z)))`
    fi
    return $result
}
z=15
echo $(countofnumbers $z)

2 个答案:

答案 0 :(得分:1)

您非常接近,干得好!

function countofnumbers {
    if [ $1 -lt 10 ]
    then
        echo $1
    else
        z=$(( $1 / 10 ))
        result=$(( $(( $1 % 10 )) + $(countofnumbers $z) ))
    fi
    echo $result
}

这是我所做的更改:

  

z=$(( $1 / 10 ))

每次使用bash进行数学运算时,请将其包装在算术运算符$(( ))中。尽管let也可以正常工作,但是您似乎或多或少地随机组合了所有3种样式(exprlet$(( )))。如果坚持一种样式,您的代码将更具可读性。

  

result=$(( $(( $1 % 10 )) + $(count $z) ))

您对此有太多的了解。仅算术运算符就足够了。 expr是算术运算符的另一种形式,但是我们在这里不需要它。

  

return $1
  return $result

Bash不像其他任何编程语言一样执行return。 Return是返回码,为0-255,主要用于表示是否发生错误。捕获的结果与您想像的一样,例如

mynum=$(countofnumbers 12)
echo $mynum
> 3

答案 1 :(得分:0)

首先:bash是唯一该工作的错误工具。

但是,无论如何:

  • Bash函数没有您尝试使用的方式returnreturn语句设置退出状态。您应该使用echo来产生函数的输出。
  • 您的大型数学表达式格式不正确; expr是命令,应放在反引号内,其后有空格,以便运行。
  • 通常,将letexpr$(())混合在一起非常麻烦,因为将它们全部嵌套在一行中也是如此。宁愿仅使用$(())进行算术扩展(这是最标准和可移植的方法),并且更喜欢将复杂的表达式分解为较小的表达式。

已修复:

function countofnumbers
{
    if [ "$1" -lt 10 ]
    then
        echo "$1"
    else
        z=$(($1 / 10))
        modded=$(($1 % 10))
        recursive_call=$(countofnumbers $z)
        result=$((modded + recursive_call))
    fi
    echo "$result"
}
z=15
countofnumbers "$z"