作者ilway25 (Nick)
看板PLT
标题Re: [问题] Haskell新手一些问题
时间Thu Dec 6 10:54:12 2012
※ 引述《subtropical (风大雨大)》之铭言:
: 几个问题请教大家
: 1.所谓pure和impure的差别?
: 我的理解是:
: pure: Output跟input直接相关 可预测
: impure: Output会受到环境的影响 不可预测
: 但还是觉得不清不楚的...
: 2.有关exponential
: expt :: Integer -> Integer -> Integer
: expt x 0 = 1
: expt x n = x * expt x (n-1)
: 这个方法好像需要用到很多空间?
: (原因是因为乘法回圈的关系)
: 乘法是 n*(n-1)*(n-2)*..*1 -> n-1次吗??
: 书上有提到一位Dirk提出用even跟odd算expt的方法,怎麽用haskell表示呢?
我也是 Haskell 新手,若有错还麻烦指正
1. 可以看看这个
http://stackoverflow.com/questions/4382223/pure-functional-language-haskell
2. exponentiation 是密码学中很重要的一环,因此有许多技巧可以来实作
http://en.wikipedia.org/wiki/Exponentiation_by_squaring
用even和odd的方法应该是上面文中的第一个:
直接照抄实作可能如下
expt :: Integer -> Integer -> Integer
expt x 1 = x
expt x n
| even n = expt (x * x) (div n 2)
| odd n = x * expt (x * x) (div n 2)
也可以偷看 Haskell 自己的 (^) 怎麽实作
http://www.haskell.org/onlinereport/standard-prelude.html
你写的 expt 的空间部份:
expt x n = x * (x * (x * ... * (x * 1)))
所以 haskell 会展开很多项,直到能算 x * 1 = x,再往上算一层 x * (x * 1)
一直到最後一层
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.25.107
1F:→ subtropical:感谢您1! 12/08 13:03