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