簡體   English   中英

識別此函數的尾遞歸調用

[英]Identifying the tail recursion call of this function

所以我有一個函數可以在無序數組中搜索某個數字。 我知道函數的最后一行是尾遞歸調用,因為是最后一行。 我知道在尾遞歸調用中,該遞歸調用將調用的函數的返回是相同的,因此操作都在遞歸調用之前完成。

但我的問題是,我怎么知道我的函數ret = search_array (n , array , low , mid - 1)的遞歸調用不是尾遞歸調用?

我很容易看到尾遞歸的其他示例,例如以累加器為參數的階乘數,但在這種情況下,我無法像在其他函數中那樣容易地識別尾遞歸。

int search_array (int n , int * array , int low , int high ) {
    int mid , ret ;

    if ( low > high ) {
        return -1;
    }

    mid = ( low + high ) / 2;
    if ( array [ mid ] == n ) {
        return mid ;
    }

    ret = search_array (n , array , low , mid - 1) ;
    if ( ret != -1) {
       return ret ;
    }

    return search_array (n , array , mid + 1 , high ) ;
}

你這么說

我知道在尾遞歸調用中[...函數的]操作都是在遞歸調用之前完成的。

您顯然看到滿足於

 return search_array (n , array , mid + 1 , high ) ;

但顯然,它並不滿足於

 ret = search_array (n , array , low , mid - 1) ;

因為遞歸調用的返回值在調用執行之前無法賦值給ret 該調用不是尾遞歸的,因為該函數在返回后必須執行其他操作。 即使返回的值肯定是遞歸調用的返回值(它不是),中心概念也不是函數返回什么,而是它是否在遞歸調用和執行返回之間執行進一步的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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