用递归来优化JavaScript代码

ZDNet软件频道 时间:2003-04-17 作者:BUILDER.COM |  我要评论()
本文关键词:
今天,资源已经不像过去那样紧张了,但是没有理由抛弃紧缩编写的代码。即使作为一个高级概念,递归还是能被用来减少JavaScript函数的体积。
本文译自Builder.com就像许多从C派生的语言一样,JavaScript支持递归——一个直接或间接调用其自己的函数。如果一个函数直接调用自己,那这个函数就是递归的。如果递归发生于一组函数之间,那他们就被称为相互递归。

在编写一个递归函数时,必须包含一个终止递归的条件,即一个停下来的路径。如果没有终止条件,函数将不停地调用自己本身,耗费掉越来越多的资源(和时间),直到发生错误才会终止。阶乘函数是描绘终止条件的最好的例子。阶乘被写作n!,表示从1到n之间的整数的乘积。因此,5!表示5×4×3×2×1,等于120。列表A示例了阶乘函数的递归实现。

请注意终止条件:当intN小于或等于1时将返回1。当intN为其它值时,返回的是intN与(intN-1)的阶乘的积,递归就在这里发生。对于终止条件的重要性,再怎么强调也不过分。在写递归函数时很容易就忘了加上终止条件。忘掉终止条件就如同开一辆没有刹车的汽车一样。它最终会停止的,但绝不是你想要的结果。

为什么使用递归?

当有其它非递归方法来解决问题的时候为什么还要使用递归呢?一个原因是递归函数一般都比较简短,在带宽不足的情况下,函数当然越短越好。计算Fibonacci数列中某个数字的函数就是一个反映这种大小差异的例子。

递归的起源

关于Fibonacci数的起源要回溯到1202年,那时要计算兔子在理想环境下的繁殖速度。从一对新出生的兔子开始,架设这对兔子能够在月底交配而且会产下另一对兔子。

在第二个月底,就有了两对兔子。在第三个月底,原来的一对又产下一对兔子,这样总共有三对兔子。到第四个月,第二对兔子开始繁殖,于是有五对兔子。虽然小兔子出生后需要时间长大,但很快就能弥补回来。25年后,一共将会有222,232,244,629,420,445,529,739,893,461,909,967,206,666,939,096,499,764,990,979,600对兔子!

列表B中示例了这个函数的非递归版本,比起列表C中的递归版本来显然要长得多。

除了递归之外,列表B还示范了一个指向函数本身的方法。下面这一行:

return(arguments.callee(intN-1)+arguments.callee(intN-2));

也能被写成:

return(fibonacci(intN-1)+fibonacci(intN-2));

用arguments.cllee(x)替换传统的fibonacci(x),可以将函数嵌入另一个函数中而不会导致错误。


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134