繁体   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