高階函式與尾遞迴優化

2021-09-01 14:52:28 字數 1354 閱讀 5092

高階函式特點

1.函式接收的引數是乙個函式

2.函式的return值中包含函式

滿足以上任一條件就稱這個函式為高階函式。

高階函式例子

某個函式的return值可以是任何函式,包括自己

ef test1():

print

("from test1"

)def

test2()

:print

("from test2"

)return test1

f = test2()f(

)

def

test()

:print

("from test"

)return test

f = test()f(

)

尾遞迴優化

尾遞迴即將遞迴呼叫的結構放在函式執行的最後一步,在呼叫遞迴操作之後不存在其他語句。

使用尾遞迴可以提高程式執行效率,減少棧溢位的情況。

具體是在函式return位置呼叫另乙個執行的函式,即return 函式名()

#一般遞迴

deftest

(n):

if n ==1:

return

1else

:return n + test(n -1)

print

(test(5)

)

#尾遞迴

deftest

(n, d=0)

:if n ==1:

return d +

1else

: d = d + n

return test(n -

1, d)

print

(test(5)

)

一般遞迴執行時:

test(5)

5 + test(4)

5 + 4 + test(3)

5 + 4 + 3 +test(2)

5 + 4 + 3 + 2 +test(1)

5 + 4 + 3 + 3

5 + 4 + 6

5 + 10

15

尾遞迴執行時:

test5,0)

test(4, 5)

test(3, 9)

test(2, 12)

test(1, 14)

15

Scala高階之路 尾遞迴優化

scala高階之路 尾遞迴優化 遞迴呼叫有時候能被轉換成迴圈,這樣能節約棧空間。在函式式程式設計中,這是很重要的,我們通常會使用遞迴方法來遍歷集合。而不是所有的遞迴都能被優化。遞迴之所有能被優化是在指在函式的最後一行為遞迴呼叫 即尾遞迴 並且這個遞迴呼叫沒有其它元素參與。一.什麼情況能導致棧的溢位 ...

尾遞迴優化

尾遞迴就是遞迴語句在函式最後執行,且無需對返回值進行進一步操作。編譯器會對這種遞迴進行優化,在進入深層遞迴時候,不是在遞迴棧進行入棧操作,而是直接覆蓋棧頂。線性遞迴與尾遞迴區別如下 線性遞迴 1 2 3 4 5 longrescuvie longn 尾遞迴 1 2 3 4 5 6 7 8 9 10 ...

尾遞迴優化

什麼是尾遞迴 尾遞迴就將遞迴呼叫寫在函式的尾部return 尾遞迴的好處 解決傳統遞迴的棧溢位問題 尾遞迴適合的業務場景 1.需要遞迴優化的函式沒有用timeout等非同步佇列進行遞迴呼叫函式自己 2.需要遞迴優化的遞迴函式的返回值不是每次都返回,而是條件性返回 尾遞迴優化後的遞迴demo meth...