haskell(18)

本博客所有内容是原创,未经书面许可,严禁任何形式的转载。

http://blog.csdn.net/u010255642


14、递归

haskell中没有forloopwhile之类的语句,而是采用递归来替代循环。递归函数是指一些会在函数内调用自己的函数,我们写一个求列表中最小数的函数 

mymin::(Ord a)=>[a]->a

mymin []=error "empty list!"

mymin [x]=x

mymin (x:xs)

       |x<minval=x

   |otherwise=minval

       where minval=mymin xs 


运行一下

*Main> mymin [12,22,8]

8

*Main> mymin [12,22,88]

12

*Main> mymin [52,22,88]

22
  我们以[52,22,88]为例说明递归的过程, mymin函数匹配(x:xs),先提取52x的值,然后执行where语句的minval=mymin xs ,此时,xs[22,88],再一次调用 mymin,函数再次匹配(x:xs),执行where语句后,xs[88],函数匹配mymin [x]=xmymin首次返回了需要的值88,即minval88,此时递归到了底层,不会再继续调用mymi,开始回溯,读取到了x22minval88,最终求得最小值为22

下面这个完成对一个列表的偶校验。

-------

myct::[Int]->Int

myct []=0

myct (x:xs)=x+mysum

      where mysum=myct xs

myecc mydata=mydata ++ [(myct mydata) `mod` 2]


运行效果为:

*Main> myecc [1,0,0,1,1]

[1,0,0,1,1,1]

*Main> myecc [1,0,0,1,0]

[1,0,0,1,0,0]

*Main>

递归存在效率低下和占用堆栈耗用量的问题,我们来体验下尾递归, 如果在递归函数中,递归调用返回的结果总被直接返回,则称为尾部递归。

下面是一个阶乘的尾递归:

mycproduct::Int->Int->Int

mycproduct myn mya

       |myn<0=0

       |myn==0=1

   |myn==1=mya

   |otherwise=mycproduct (myn-1) (myn*mya)


运行效果如下:

*Main> mycproduct 5 1

120

*Main> mycproduct 2 1

2

*Main> mycproduct 3 1

6

*Main> mycproduct 4 1

24

*Main> mycproduct 5 1

120

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值