最美丽的编程语言Scheme——线性的递归和迭代

我们在上一章的复习讲座中已经提到了Scheme中的递归调用。我们熟悉C/C++或Java等命令式编程语言的朋友对递归应该不陌生吧,呵呵。我们本讲将介绍一下Scheme中的递归调用。

作为一个函数式编程语言,其优美的地方就是用了很多递归实现。在函数式编程语言中,递归比一般的迭代用得更多。由于函数式编程语言最初都是解释执行的,因此对函数的调用有尾调用(Tail Call)的实现,从而对过程调用的数目与存储器占用的关系不是线性递增的关系,而是常量关系。即,Scheme总能在常量空间中执行迭代型计算要求。

 

这里先简单讲讲什么是尾调用。

在计算机科学中,一个尾调用是一个产生返回值的子例程调用。也就是说,一个过程通过调用另一个子例程后被直接返回,那么我们称对那个子例程的调用是一个尾调用。比如:

 

我们看到上述一个C代码,proc中对inc子例程的调用就是尾调用。因为,调用inc后,其返回值也立即作为proc的返回值被返回。

我们可以再看一些例子:

 

另外,如果一个过程中有分支,并且在分支中最后也是通过调用一个子例程后直接返回,那么对该子例程的调用也是尾调用的,呵呵。

如果一次尾调用是调用者自己,那么称这个尾调用是尾递归

 

下面进入正题,我们先看最典型的递归——阶乘:

 

其实有了前面的基础,用Scheme写递归看上去比用C写更容易些,呵呵。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值