3 回答
![?](http://img1.sycdn.imooc.com/533e4d470001a00a02000200-100-100.jpg)
TA贡献1815条经验 获得超6个赞
莱曼条款:
递归函数是一个调用本身
再深入一点:
如果函数一直在调用自己,它如何知道何时停止?您设置了一个条件,称为基本情况。基本情况告诉我们的递归调用何时停止,否则它将无限循环。
对我来说,一个很好的学习例子,因为我有很强的数学背景,阶乘..下面的注释显示,阶乘函数可能有点过了,我会把它放在这里,以防您想要它。
function fact($n) { if ($n === 0) { // our base case return 1; } else { return $n * fact($n-1); // <--calling itself. }}
关于在Web开发中使用递归函数,我不亲自使用递归调用。我并不认为依赖递归是一种糟糕的做法,但它们不应该是您的第一个选择。如果使用不当,它们可能是致命的。
虽然我无法与目录示例竞争,但我希望这在一定程度上有所帮助。
检查这个问题也是有帮助的,在这个问题上,公认的答案用非专业术语演示了递归函数是如何工作的。尽管OP的问题涉及Java,但概念是相同的,
![?](http://img1.sycdn.imooc.com/54584e1f0001bec502200220-100-100.jpg)
TA贡献1877条经验 获得超1个赞
例如,打印给定目录的任何子目录中的每个文件(如果在这些目录中没有符号链接,这可能会导致函数中断)。打印所有文件的伪代码如下所示:
function printAllFiles($dir) { foreach (getAllDirectories($dir) as $f) { printAllFiles($f); // here is the recursive call } foreach (getAllFiles($dir) as $f) { echo $f; }}
其思想是首先打印所有子目录,然后打印当前目录的文件。这个想法被应用于所有子目录,这也是对所有子目录递归调用此函数的原因。
如果您想要尝试这个例子,您必须检查特殊目录。.
和..
,否则你会被困在电话里printAllFiles(".")
一直。此外,您还必须检查要打印什么以及当前工作目录是什么
![?](http://img1.sycdn.imooc.com/533e4d470001a00a02000200-100-100.jpg)
TA贡献1842条经验 获得超21个赞
$timeToGoHome = '23'; // Let's give ourselves an hour for last call and getting homefunction orderAndDrinkBeer($timeToGoHome) { // Let's create the function that's going to call itself. $beer = New Beer(); // Let's grab ourselves a new beer $currentTime = date('G'); // Current hour in 24-hour format while ($beer->status != 'empty') { // Time to commence the drinking loop $beer->drink(); // Take a sip or two of the beer(or chug if that's your preference) } // Now we're out of the drinking loop and ready for a new beer if ($currentTime < $timeToGoHome) { // BUT only if we got the time orderAndDrinkBeer($timeToGoHome); // So we make the function call itself again! } else { // Aw, snap! It is time :S break; // Let's go home :( }}
- 3 回答
- 0 关注
- 477 浏览
添加回答
举报