用shell显示斐波那契数列前n项 Linux Ubuntu 18.04.2 新手图文教程
文章目录shell代码 写在前面:这学期有Linux课,其中有一次的课后作业要求:编写一个shell程序,显示Fibonacci数列的前20项。例如:1,1,2,3,5,8,13,21…。 于是我在Ubuntu版本下用vim编辑器写了个名为Fibonacci.sh的shell脚本,输入数字n就能显示斐波那契数列的前n项。 当时写到如何计算出斐波那契数列第n项的时候不知道怎么求,想到头都...
文章目录
写在前面:这学期有Linux课,其中有一次的课后作业要求:编写一个shell程序,显示Fibonacci数列的前20项。例如:1,1,2,3,5,8,13,21…。
我在Ubuntu版本下用vim编辑器写了个名为Fibonacci.sh的shell脚本,输入数字n就能显示斐波那契数列的前n项。
当时写到如何计算出斐波那契数列第n项的时候不知道怎么求,想到头都爆了,后来列出斐波那契数列的前7项,最后还是通过找规律最后才发现其中的奥妙(暴力求解)…,我定义了三个变量abc,其中a=1为数列的第一项,b=1为第二项,而c作为中间变量用来储存a的值。
大家先来看看vim下Fibonacci.sh的 核心代码:
c=${a}
a=${b}
b=$((${c}+${b}))
我来解释下:a=${b}
这时a就变成了a的下一项的值,b=$((${c}+${b}))
这时b就成了b的下一项的值,而c=${a}
是为了保留a在变成下一项之前的值,方便b变成下一项的值时进行运算(因为a已经变成a的下一项了,所以不能直接+a。而如果直接b=$((${a}+${b}))
,那么下一次a=${b}的值就改变了),然后把三个运算放在循环里就可以无限地算下去了。
创建shell脚本
1. 打开终端,
a.桌面右键=>打开终端(E)。b.也可以通过快捷键Ctrl+Alt+T打开终端。c.或者打开应用程序列表,找到终端,或者在搜索框输入“ter”或者“”终端“。
a.桌面右键=>打开终端(E)
b.快捷键Ctrl+Alt+T
c.应用程序列表
2. 终端默认目录
打开终端后默认路径是当前用户的主目录,也就是/home/用户名
,在我这里是/home/forest
。
3. 创建存储脚本的目录
在当前目录下(/home/forest)创建一个储存shell脚本的目录(mkdir myShell),这样可以方便管理写过的shell脚本。进入该目录(cd myShell),下面这条指令可以创建并进入myShell,这时当前目录为 /home/forest/myShell
mkdir myShell; cd myShell
4. 创建shell脚本,并用vim编辑
在该目录下创建shell脚本(vim Fibonacci.sh),我这里用的时vim文本编辑器(vim要自行安装: sudo apt install vim
),也可以用vi来编辑,不过vim是vi的升级版,建议用vim。 Fibonacci是我这个shell脚本的文件名,读者可以自行命名更改。
vim Fibonacci.sh
输入完vim Fibonacci.sh后,终端直接变成vim编辑器,然后就可以编辑代码了,复制下面的代码,然后进入插入模式,右键粘贴然后从普通模式进入命令模式保存退出就可以了。
4.1 了解Vim的三种模式
了解Vim的几种模式,能让我们更容易上手,vim有三种模式:普通模式、插入模式、命令模式。
普通模式下能移动光标、删除代码、执行一些命令、转换到插入模式或者命令模式。 普通模式下按下i
键进入插入模式,普通模式下按下:
(即shift+;)进入命令模式。
插入模式下能编辑、删除代码、转到普通模式。插入模式下按下esc
键回到普通模式,不能从直接插入模式转到命令模式。
命令模式下保存代码、退出vim、执行命令回到终端、转到普通模式。命令模式下输入wq
然后回车保存并退出vim,输入q!
然后回车强制不保存退出vim,esc
键回到普通模式。
shell代码
自己写完代码后一定要检查,如格式、空格(if、for里要特别注意)、大小写、符号、字体符合是否为英文格式。
#!/bin/bash
#输入数字n显示斐波那契数列的前n项
a=1 #第一项
b=1 #第二项
c=0 #中间变量,用来储存a的值
Fibonacci=0 #斐波那契数列的第n项
read -p "输入数字n,显示数列的前n项" n
#如果n<=3则输出前三项
if [ "${n}" -le "3" ]; then
case ${n} in
"1")
Fibonacci=${a}
echo -e "${Fibonacci}"
;;
"2")
Fibonacci=${a}
echo -e "${Fibonacci}"
echo -e "${Fibonacci}"
;;
"3")
Fibonacci=${a}
echo -e "${Fibonacci}"
echo -e "${Fibonacci}"
Fibonacci=$((${a}+${b}))
echo -e "${Fibonacci}"
esac
fi
#如果n>=4,输出剩余的项
if [ "${n}" -ge "4" ]; then
Fibonacci=${a}
echo -e "${Fibonacci}"
echo -e "${Fibonacci}"
Fibonacci=$((${a}+${b}))
echo -e "${Fibonacci}"
for ((i=4; i<=${n}; i=i+1 ))
do
c=${a}
a=${b}
b=$((${c}+${b}))
Fibonacci=$((${a}+${b}))
echo -e "${Fibonacci}"
done
fi
运行shell脚本
启动shell脚本命令:bash xxx.sh(xxx为这个shell脚本的文件名)
bash Fibonacci.sh
运行结果
输入数字查看结果
总结
这个代码还是有冗余重复的代码的,例如case里的代码和if里的代码就有重复部分。
这里咱们再来仔细看看斐波那契数列的定义:第n项的值等于第n-1项与第n-2项的和 ,即F(n)=F(n-1)+F(n-2)(n>=3)。
根据上面的公式F(n-1)=F(n-2)+F(n-3),F(n-2)=F(n-3)+F(n-4),大家发现了没有,斐波那契数列其实是个递归函数。然而当时还不知道什么时递归…不然代码量就可以减少很多(头发就不用掉一地了)。
下一篇博客写函数和递归,用递归的方式实现输入数字n,打印斐波那契数列的前n项。
纸上得来终觉浅,绝知此事要躬行
2021.03.19更新代码
#!/bin/bash
#输入数字n显示斐波那契数列的前n项
#斐波那契数从第3项开始,每一项都等于前两项之和。
a=1 #第一项
b=1 #第二项
c=0 #中间变量,用来储存a的值
read -p "输入数字n,显示数列的前n项:" n
for((i=1; i<=${n};i=i+1))
do
if [ "${i}" -le "2" ];then #注意if后面要空格、"[" 之后 和 "]" 之前>都要空格
echo -n " $a"
else
c=${a} #c为中间变量,方便b变成b的下一项
a=${b} #a变成a的下一项
b=$((${c}+${b})) #b变成b的下一项,即a+b
echo -n " $b" #此时b为前两项之和
fi
done
echo "" #换行,不然不好看
输出截图
更多推荐
所有评论(0)