且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

shell 整理(36)===写斐波那契数列

更新时间:2022-09-22 15:37:38

(一)写如下所示数列


[root@localhost ding1]# bash 5.sh 

2/1

3/2

5/3

8/5

13/8

21/13

34/21

55/34

89/55

144/89

233/144


shell代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
 
>aa
>bb
echo 1 2 | xargs -n1 >aa
 
for in `seq 20`
do
a=`cat aa | sed -n ''$i'p'`
b=`cat aa |tail -1`
echo $(($a+$b)) >>aa
c=`cat aa | sed -n ''$(($i+1))'p'`
echo $c/$a >>bb
done
cat bb


计算结果如下,用awk 计算

1
[root@localhost ding1]# bash 5.sh |awk -F '/' '{a+=$1/$2;print a}'

2

3.5

5.16667

6.76667

8.39167

10.0071

11.6261

13.2437

14.8619

16.4799

18.098

19.716

21.334

22.9521

24.5701

26.1881

27.8062

29.4242

31.0422

32.6603

[root@localhost ding1]# 



上面的代码是输出文本,略微有点复杂,我补充第二中方法:

shell 代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
 
a=1    #定义一个变量a 和 b 
b=2
 
for in `seq 20`
do
        echo $b/$a    #shell 解析的时候是从上往下一步步来的,所以顺序是非常重要的。
        c=$((a+b))    a=$b 和 b=$c不能颠倒过来
        a=$b        
        b=$c
done
 
第一次循环:  2/1     c=3   a=2  b=3
第二次循环:  3/2     c=5  a=3   b=5
第三次循环:  5/3     c=8   a=5  b=8
........


如果打印一个这样的数列是不是也会了

例如:

1

2

3

5

8

........

shell 代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
 
a=1
b=2
echo 1
for in `seq 20`
do
        echo $b
        c=$((a+b))
        a=$b
        b=$c
done


输出如下:

[root@localhost ding1]# bash 6.sh

1

2

3

5

8

13

21



本文转自 大雪儿 51CTO博客,原文链接:http://blog.51cto.com/dingxue/1970438,如需转载请自行联系原作者