簡體   English   中英

有沒有更好的方法來一次退出所有遞歸函數,而不是一個一個地退出?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM