日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > Scala Learning(3): Tail Recursion定義

Scala Learning(3): Tail Recursion定義

來源:程序員人生   發布時間:2015-07-22 23:44:57 閱讀次數:2583次

關于尾遞歸 ,使用Scala的兩個例子展現尾遞歸的定義和簡單實現。

例子比較

求最大公約數的函數

def gcd(a: Int, b: Int): Int = if (b == 0) a else gcd(b, a % b)

計算的展開是尾遞歸的,

gcd(14, 21) -> if (21 == 0) 14 else gcd(21, 14 % 21) -> if (false) 14 else gcd(21, 14 % 21) -> gcd(21, 14 % 21) -> gcd(21, 14) -> if (14 == 0) 21 else gcd(14, 21 % 14) -> gcd(14, 7) -> gcd(7, 0) -> if (0 == 0) 7 else gcd(0, 7 % 0) -> 7

求階乘的函數

def factorial(n: Int): Int = if (n == 0) 1 else n * factorial(n - 1)

計算的展開是非尾遞歸的,

factorial(4) -> if (4 == 0) 1 else 4 * factorial(4 - 1) -> 4 * factorial(3) -> 4 * (3 * factorial(2)) -> 4 * (3 * (2 * factorial(1))) -> 4 * (3 * (2 * (1 * factorial(0))) -> 4 * (3 * (2 * (1 * 1))) -> 120

尾遞歸定義

1個簡單精煉的定義:

If a function calls itself as its last action, the function`s stack frame can be reused. This is called tail recursion.

gcd函數在else分支后面調用的是自己,而factorial函數在else分支里,調用自己以后還乘以了n,所以不是尾遞歸。

改寫

factorial函數里,寫1個函數,接收n和累計的乘積值,便可變成尾遞歸。

def factorial(n: Int): Int = { def tailIter(product: Int, n: Int): Int = { if (n == 0) product else tailIter(product*n, n-1) } tailIter(1, n) }

全文完 :)

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: av一级毛片 | 在线观看欧美一区 | 国产精品久久久久久久第一福利 | 免费的三级网站 | 免费av网站在线看 | 二区视频 | 久久aaa | 成人av在线网 | 日韩精品在线观看视频 | 国产精品日韩一区 | 精品一区二区三区在线播放 | 日韩精品在线观看视频 | 懂色av影视一区二区三区 | 日韩天堂 | 久久综合久 | 欧美精品久久久久久久免费软件 | 日韩欧美色综合 | 视频一区二区国产 | 国产玖玖视频 | 精品国产乱码久久久久久图片 | 色婷av | 成人天天干 | 黄色1级毛片 | 亚洲免费在线观看视频 | 亚洲欧美日韩在线播放 | 一级片av | 免费日本视频 | 亚洲成人二区 | 十八女人毛片免费视频 | 麻豆少妇 | 国产精品久久久精品 | 九一在线免费观看 | 一区二区三区在线电影 | 久久久蜜桃一区二区人 | 国产精品精品久久久 | 国内精品一区二区 | 日韩欧美在线免费观看 | 日本一区二区三区视频在线 | 国产一区二区自拍视频 | 久久久久免费 | 久久久精品亚洲 |