[英]Is there a better way to exit all recursive functions at once, rather than one by one?
是否有更好的方法可以在滿足if(a == b)
條件后立即退出所有遞歸迭代,而不必以當前形式包含第 7 行和第 8 行? 如果沒有當前的第 7 行和第 8 行,它似乎只退出了最后一次迭代。
bool recursive(int a, int b) {
if(a == b)
return true;
for(int i = 0; i < count; i++)
if(locked[b][i] == true)
if(recursive(a, i) == true)
return true;
return false;
}
這並不是很重要,但我想盡可能地節省線路。 有任何想法嗎?
我可能會這樣寫:
bool recursive(int a, int b) {
bool result = (a == b);
for (int i = 0; i < count && !result; i++) {
result = (locked[b][i] && recursive(a, i));
}
return result;
}
引入一個變量來保存 function 的工作結果允許測試該結果作為執行循環迭代的條件的一部分。 這樣一來,當結果從false
變為true
時,您就可以終止循環,但您不需要任何代碼來區分循環終止的兩個可能原因。
是的。 您可以使用名為longjmp
的 C 的有點晦澀的功能。 它允許在多個 function 調用上跳回堆棧。 有點類似於throw
C++。
首先,使用setjmp()
創建返回環境。 如果 to 是對setjmp()
的第一次調用,則返回0
。 否則,它返回一個由longjmp()
設置的值,在遞歸調用中調用得更深。
#include <stdio.h>
#include <setjmp.h>
void slowrec(int n) {
if (n == 0) {
puts("done");
} else {
puts("go down");
slowrec(n - 1);
puts("go up");
}
}
jmp_buf env;
void fastrec(int n) {
if (n == 0) {
puts("done");
longjmp(env, 1);
} else {
puts("go down");
fastrec(n - 1);
puts("go up");
}
}
int main() {
puts("-- slow recursion --");
slowrec(5);
puts("-- longjmp recursion --");
if (setjmp(env) == 0) {
fastrec(5);
}
return 0;
}
產生:
-- slow recursion --
go down
go down
go down
go down
go down
done
go up
go up
go up
go up
go up
-- longjmp recursion --
go down
go down
go down
go down
go down
done
對於原始問題,代碼可能如下所示:
jmp_buf env;
void recursive_internal(int a, int b) {
if (a == b) longjmp(env, 1); // true
for(int i = 0; i < count; i++)
if(locked[b][i])
recursive_internal(a, i);
}
bool recursive(int a, int b) {
if (setjmp(env) == 0) {
recursive_internal(a, b);
// left without triggering long jump
return false;
}
// returned with longjmp
return true;
}
請注意,在recursive_internal
中沒有返回值,因為滿足a==b
條件並且采用longjmp
,因為它是唯一可以返回true
的方式。 否則,條件永遠不會滿足,算法通過return false
退出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.