让我们将用户的输入视为9
。所以斐波那契数列直到 9 如下 0,1,1,2,3,5,8,13,21
预期输出: 0,*,1,*,3,*,8,*,21
下面是我用来实现逻辑的代码
UserInput=9
a=0
b=1
echo "The Fibonacci series is : "
for (( i=0; i<UserInput; i++ ))
do
if [ $i -eq 2 ]
then
echo -n "$a "
sn=$((a + b))
a=$b
b=$sn
fi
done
答案1
基于强制awk
的解决方案(为简单起见,我假设n>2
):
awk -v n=9 'BEGIN{q=1; printf "0,*,"; for (i=2;i<n;i++) {s=q+r;r=q;q=s; printf "%s%s",i%2?"*":s,i==n-1?"\n":","}}'
用户输入存储在变量中并通过命令行参数n
传递。awk
-v n=number
为了立即退出,如果n<3
:
awk -v n=9 'BEGIN{if (n<3) exit; q=1; printf "0,*,"; for (i=2;i<n;i++) {s=q+r;r=q;q=s; printf "%s%s",i%2?"*":s,i==n-1?"\n":","}}'
解释
awk
是一个文本处理工具,我们正在“创造性地滥用”它。因此,一切都发生在BEGIN
块内,该块通常包含在处理第一个输入文件之前执行的代码。
语法本身非常像 C,所以我们
- 打印该级数的前两项(由于我们假设 ,所以它们是固定的
n>2
):printf "0,*,"
- 从 循环
2
到n-1
并计算斐波那契数s
作为前两个 和 的总和q
,r
并更新q
和r
*
如果是偶数,则打印;如果不是偶数,i
则打印当前的斐波那契数( )s
i%2?"*":s
- 然后打印 a
,
或换行符,具体取决于我们是否到达循环末尾 (i==n-1
)。
答案2
使用 Bash 和算术运算符最接近您的代码是:
#!/bin/bash
let UserInput=9
let a=0
let b=1
echo -n "The Fibonacci series is: 0"
for (( i=1; i<UserInput; i++ )) ; do
let sn=a+b
let a=b
let b=sn
if (( i % 2 == 0 )) ; then
echo -n ",$a"
else
echo -n ",*"
fi
done
echo
在if
语句中,您必须使用%
模(余数)运算符。使用它你可以测试是否i
能被二整除(即偶数)并相应地打印 的值$a
或打印 a *
。
输出将是:
The Fibonacci series is: 0,*,1,*,3,*,8,*,21
更改脚本,以便它从其自身获取步骤数争论,请修改脚本的第一行,如下所示:
let UserInput="$1"