方法一:遞回
// Recursion
suspend fun findAndHandleFile(fileName: String, timeoutMs: Long, startTiming: Long, intervalMs: Long = 3000) {
val file = findWithFileName(fileName)
if (file != null) {
handleFile(file)
} else {
val passedTime = System.currentTimeMillis() - startTiming
if (passedTime < timeoutMs) {
delay(internalMs)
findAndHandleFile(fileName, timeoutMs, startTiming)
}
}
}
方法#2:
suspend fun findAndHandleFile(fileName: String, timeoutMs: Long, startTiming: Long, intervalMs: Long = 3000) {
val file = findFile(fileName, timeoutMs, startTiming, 3000)
if (file != null) {
handleFile(file)
}
}
suspend fun findFile(fileName: String, timeoutMs: Long, startTiming: Long, intervalMs: Long = 3000): File? {
var file = findWithFileName(fileName)
while(file == null && System.currentTimeMillis() < startTiming timeoutMs) {
delay(intervalMs)
file = findWithFileName(fileName)
}
}
目前,我使用方法 #1 仍然沒有發現任何問題(不要導致 StackOverflowError)
- 它在一個小時內運作良好
我想從方法 #1 重構為方法 #2,但仍然不清楚它能從中得到什么好處。
在 Android 應用程式上運行時,我對上述方法的問題是:
- 方法#2 是否比方法#1 更有效?這些是什么?
希望得到大家的分享。謝謝
uj5u.com熱心網友回復:
除非您使用尾遞回,否則遞回會帶來增加記憶體使用的風險和堆疊溢位的風險。在 Kotlin 中,出于我不確定的原因,您必須使用tailrec關鍵字顯式標記函式以利用尾遞回。我認為你的職能是候選人。
然而,使用遞回的目的是讓代碼更簡單、更容易理解。通常這意味著您正在將問題分解為更小的版本。將它用于定時回圈只會使您的代碼更加復雜,因此這不是遞回的好用法。
您的代碼可以這樣重寫,我認為邏輯更容易理解:
suspend fun findAndHandleFile(fileName: String, timeoutMs: Long, startTiming: Long, intervalMs: Long = 3000) {
while (System.currentTimeMillis() < startTiming timeoutMs) {
val file = findWithFileName(fileName)
if (file != null) {
handleFile(file)
break
}
delay(intervalMs)
}
}
此外,您可以利用withTimeoutOrNulland aflow使其(在我看來)更容易遵循邏輯:
suspend fun findAndHandleFile(fileName: String, timeoutMs: Long, intervalMs: Long = 3000) {
val fileMonitor = flow<File?> {
while(true) {
emit(findWithFileName(fileName))
delay(intervalMs)
}
}
withTimeoutOrNull(timeoutMs) {
handleFile(fileMonitor.filterNotNull().first())
}
}
uj5u.com熱心網友回復:
您的方法(#1)不是遞回。遞回的要點不是從它自己呼叫相同的函式,它是在解決相同的問題,但重復的復雜性較低,直到達到基本狀態。例如,使用數學運算元遞回 - !。
5!可以寫成:
int total=1;
for(int i=1; i<num;i )
total*=i;
或者它可以遞回地寫成這樣:
private int recursive(int n)
if(n == 0)
return 1;
else
return n*(recursive(n-1));
您正在使用的是一種延遲機制,可以在您的操作失敗時呼叫您自己。這是與遞回無關的一般用途。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/533954.html
標籤:安卓科特林递归
上一篇:字串運算式的計算器。電源操作問題
下一篇:有限硬幣-使用遞回
