作者JonathanWang (尹儿)
看板b95902HW
标题[课程] 递回的真谛..
时间Fri Oct 13 02:45:04 2006
递回就是函数呼叫, 虽然它似乎很特别, 是呼叫自己..
但如果彻底了解函数呼叫的话, 会发现它没有什麽特别的 :)
我想, 递回令人觉得玄妙的地方有两个:
1. 递回函数的「里面」会呼叫自己, 当我们递回函数里面要呼叫自己的地方时,
整个递回函数是还没有写完的 (因为还正在写它的里面),
感觉很像在呼叫一个还没有完成的函数..
2. 递回函数重覆地呼叫自己, 所以免不了地, 会使用到完全一样名称的变数,
那麽它们会不会互相践踏?
对於第 1 个问题:
电脑在执行你的程式时, 你的整个程式都是完成的, 所以要递回呼叫的时候,
电脑所面对的, 是一个已经完成,完整的函数, 所以电脑不会有这个困扰.
而需要克服的, 是你在写程式时的心理障碍, 你应该假想你已经完成了,
假想你呼叫的是一个已经写好的程式...
对於第 2 个问题:
(希望你已经完全看懂上面那一篇「今天晚上讲的几种变数..」)
递回函数里面可能会有的变数有三种: 参数, 区域变数, 静态变数.
其中参数和区域变数几乎是一样的,
每一次这个函数 (就算它不是递回函数) 被呼叫的时候,
它们都会「重生」出来, 所以每一层的呼叫 (递回函数一次又一次呼叫自己,
我们习惯称它叫作第一层, 第二层, 第三层, ...),
用的都是那一层自己独有的变数, 函数里的程式码在执行的时候,
都只会用到那一层的变数 (参数+区域变数), 而不会也无法用到其他层的.
而静态变数的话, 它是永生不死, 也不会重生的,
所以整个程式里头不管是哪一次呼叫, 用的都是同一份.
(附带一提, 在递回函数里面, 当然也像在其他函数里面的时候一样,
可以使用全域变数, 只是全域变数应该在函数外头宣告,
而不会在函数里头宣告, 而且全域变数也是永生不死的,
贯串整个程式, 用的都是同一份)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.30.44
1F:推 yease:谢谢:] 10/13 08:13
2F:推 waterwinds:助教辛苦了~~~~ 10/13 09:42
3F:→ locationc:可以想成呼叫一个和自己一模一样的函数吧 10/14 01:03