多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

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

Scala Learning(3): Tail Recursion定義

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

關于尾遞歸 ,使用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) }

全文完 :)

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 日本一二三四区免费视频 | 免费欧洲毛片a级视频 | 成 人 免费 网站 | 欧美一级特黄特黄毛片 | 免费国产一区二区在免费观看 | 欧美精品综合 | 国产一级毛片欧美视频 | 日韩中文字幕精品久久 | 欧美日韩在线第一页 | 欧美激情videos | 伊人三级 | 黑人性xxx | 成人社区网站 | 久久精品a一国产成人免费网站 | 一级做a爰片性色毛片中国 一级做a爰全过程免费视频毛片 | 手机在线亚洲 | 亚洲成人天堂 | 免费视频观看在线www日本 | 色综合久久98天天综合 | 看片久久| 国产美女久久久亚洲 | 波多野结衣 在线资源观看 波多野结衣 一区二区 | 国产综合影院 | 手机看片福利永久 | 欧美18videosex性欧美老师 | 久久久久欧美国产精品 | 性欧美暴力猛交69hd | 黄色网址免费在线 | 国产福利二区 | 国产精品视频一区二区三区 | 欧美性受| 中国在线观看www视频 | 亚洲人成777 | 日韩高清一区二区三区五区七区 | bbw老妇性hd| 免费在线公开视频 | 国产精品一区二区在线观看 | 国产免费福利体检区久久 | 免费视频一区二区性色 | 日本激情啪啪 | 亚洲小说另类 |