尾递归

尾递归:

  

 

https://en.wikipedia.org/wiki/Tail_call

'Tail calls can be implemented without adding a new stack frame to the call stack'

如果语言对尾递归的情况做过优化,那么在调用时候可以不增加栈帧,达到优化的目的。

 

拿斐波那契额数列举例:

 

 

 

 

 

 

在最后return的一行,可能会进入递归计算,导致调用栈占用空间太大

如果return后面直接跟的是这个函数本身,我们称它为尾递归 

 

 

 

 

==========================================================

例子1:

 

 

使用尾递归,

 

关键点:

1. helper function  (go)

2.  accumulator(parameter)

 

 

 

可以看到 accumulator从1开始逐渐增加,最终得到结果

 

 

例子2:斐波那契

效率太低 

 

 

 

 

使用helper function go:

我们想象一个窗口,这个窗口一开始是0,1,然后是 1,1,然后1,2,然后是2,3,我们可以利用这个窗口作为parameter来进操作。

 go n (0,1)是最基础的,

然后我们用

go 0 (a,b) 的值其实就是a

go 1 (a,b) 的值其实就是b

go n (a,b)的值 其实是 go n-1 (b,a+b)   (注意,这里在利用窗口操作)

 

 

计算fib4

 

go 4 (0,1)

=go 3 (1,1)

=go 2 (1,2)

=go 1 (2,3)

= 3

 

 总结一下共性:

1.首先找到一个helper函数,这个函数的n是递减,可以向前推导

2.在参数parameter中使用accumulator进行操作,对于例子二斐波那契,使用两个参数观察这个窗口

 

 

资料: https://www.youtube.com/watch?v=_JtPhF8MshA

 

posted @ 2019-08-17 20:07  hh9515  阅读(160)  评论(0编辑  收藏  举报