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