求助~最大公约数脚本,大小随意赋值给变量的问题

2015-01-07 15:32:47 +08:00
 Ansen
advnced bash中的一个例子提到


我的推导过程
dividend=10
divisor=20
until里面的运算步骤为
remainder=$dividend % $divisor=10 % 20 =0
dividend=$divisor=20
remainder等于0了,循环结束,那么结果为$dividend=20?
明显不对呀?

附上脚本源码
#!/bin/bash

ARGS=2
E_BADARGS=65

if [ $# -ne "$ARGS" ]
then
echo "Usage: `basename $0` first-number second-number"
exit $E_BADARGS
fi

gcd ()
{
dividend=$1
divisor=$2

remainder=1

until [ "$remainder" -eq 0 ]
do
let "remainder = $dividend % $divisor"
dividend=$divisor
divisor=$remainder
done
}

gcd $1 $2

echo; echo "GCD of $1 and $2 = $dividend"; echo

exit 0
2191 次点击
所在节点    Linux
4 条回复
Ansen
2015-01-07 15:38:39 +08:00
貌似找着问题了……
remainder=$dividend % $divisor=10 % 20 =0 这计算错误了。。囧
vinceguo
2015-01-08 16:29:16 +08:00
ABS...
我当初在平板上看那本书的时候感觉实在是蛋疼。
那语法实在是太丑了,还乱得很。可能有历史的原因,也可能需要考虑到对各种东西的兼容。
Anyway,前段时间发现Bash那个漏洞的是Stéphane Chazelas发现的,你在书里面应该看到这名字很多次了吧,里面不少代码是他贡献的。
我学bash后唯一的应用就是实现了一个经典的处理算术表达式的算法:先把算术表达式变成逆波兰表示,然后再计算,最漂亮的是这两步都只用了一个非常基础的数据结构:栈。后来才知道是鼎鼎大名的Dijkstra提出来的shutting yard算法。如果你想看代码的话: http://www.vinceguo.me/blogs/calculator/calc.sh.tar.gz

好吧,说了这一堆不相关的废话。
Ansen
2015-01-08 18:05:10 +08:00
@vinceguo 感谢分享,以我现在的水平,够我研究一段时间了
vinceguo
2015-01-08 18:14:02 +08:00
@Ansen 研究个毛线。你有兴趣的话直接找算法去实现还好一些。我最烦的就是看别人的代码。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/160000

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX