解释递归语法

解释递归语法

我是 shell 和 UNIX / GNU/Linux 的新手。

我试图理解作为递归函数一部分的语法:

 [ $i -le 2 ] && echo $i || { f=$(( i - 1)); f=$(factorial $f); f=$(( f * i )); echo $f; }

(取自这里

完整的相关函数是:

factorial(){
  local i=$1
  local f
  declare -i i
  declare -i f
  [ $i -le 2 ] && echo $i || { f=$(( i - 1)); f=$(factorial $f); f=$(( f * i )); echo $f; }

}

我理解[$i -le 2 ]意味着检查是否至少有 2 个位置参数,我只是不明白什么是双管符号(或?)。还有做什么的{}?它们是 4 个参数的 for 循环吗?

谢谢,大卫

答案1

第一的,

local i=$1

将 $1 的值赋给 i。 $1 是函数的第一个参数。或者在函数之外,它代表命令或脚本的第一个位置参数。

下面这些都是很直观的。 -i 表示变量是整数。

  local f
  declare -i i
  declare -i f

现在来说说长篇。为了清楚起见,我将把它分成单独的行。

[ $i -le 2 ]    #checks if $i is less or equal 2

&&    #this is logical AND. This is used so: X && Y, meaning if X computes to true, then compute Y. So for this function, the meaning is: if $i less or equals 2, do the following:

echo $i     #this follows the logical && above, so is computed conditionally. Namely, print $i.

||    #this is logical OR, so what follows is computed only if what's on the left boils down to false.
      #Here the meaning is, IF NOT $i -le 2 AND echo... (which doesn't matter), do what's on the right. So do what's in the {} braces, if $i is greater than 2.

现在只剩下这个了:

 { f=$(( i - 1)); f=$(factorial $f); f=$(( f * i )); echo $f; }

大括号 {} 使其中的内容成为一个块,该块被视为一个实体。为了最简单地解释这里出现的情况,前面介绍过 && 和 || 的逻辑。现在适用于整个块。现在到零件。

f=$(( i - 1));

$(( )) 是算术运算符。 f=你现在应该知道了。整个表达式的意思是赋值给f的值i - 1

请注意块的各个部分如何以分号结束;

f=$(factorial $f);

上面调用了该函数。这就是递归的地方。字面意思:分配给以为参数f调用的函数阶乘的返回值。 $f(您可能已经注意到,赋值不需要 $。$( )命令替换。您可以通过简单地调用函数的名称来调用函数,但是对于变量值赋值,必须以某种方式传递该值,这就是这里的完成方式。

f=$(( f * i ));

上面您再次看到算术运算符,即$(( ))f此处获取 的值f,此时该值等于$(factorial $f)乘以i,等于函数的 $1 参数。

最后,打印 的值f

echo $f;

答案2

||

逻辑或

{}

函数或命令集的开始-结束

for

3 个参数:初始化、条件、迭代器更改

{ f=$(( i - 1)); f=$(factorial $f); f=$(( f * i )); echo $f; }

内联函数返回一个数字

相关内容