【发布时间】:2021-08-31 13:40:02
【问题描述】:
我目前正在阅读 Steve Oualline 的“实用 C 编程第 3 版”。
目前我正在阅读关于递归的第 2 章,在这一章中,作者提出了一个练习,读者必须尝试编写一个递归函数来计算一个数字在数组中出现的次数。
请考虑以下代码:
#include <stdio.h>
size_t count(const int [], size_t, int);
enum {ARRAY_LEN = 11};
int main()
{
const int num_array[ARRAY_LEN] = {1, 2, 3, 4, 5, 5, 6, 7, 3, 9, 0};
int number = 0;
puts("Type a number: (0-9)");
scanf("%d", &number);
printf("Number of appearances: %lu\n", count(num_array, ARRAY_LEN, number));
return 0;
}
size_t count(const int n_array[], size_t arr_len, int num)
{
return arr_len == 0 ? 0 : ( n_array[arr_len - 1] == num ) + count( n_array, arr_len - 1, num );
}
我的问题是:
C 如何知道将哪个return 带回主函数?因为,在这个例子中,我们有 3 个返回,并且它们都在一定时间内它们的条件变为真,所以,C 怎么知道使用 return 0; 它必须退出递归函数而不是继续在内部寻找另一个返回count() 函数?
谢谢。
【问题讨论】:
-
return只是返回到调用函数的地方,没有魔法。 -
每个函数调用最终都会执行一次返回。如果函数以递归方式调用自身,那么该调用将在某个时刻返回,控制权将返回给调用者,而调用者将返回。这两个调用不需要执行相同的返回。每个调用都独立于其他调用。
-
语句按顺序执行。如果有条件地采用任何
return,则该函数将在该点停止执行,并且不考虑任何其他return。第一个if(arr_len == 0) return 0;结束递归,另外两个决定走哪条递归路径。 -
对于单个帧,导致
return 0;的控制流不涉及对count的调用,而其他分支则涉及。这使它成为基本案例而不是递归案例。 -
但是如果最后一个
return返回一个0,那count()函数怎么还会返回出现次数呢?最后,只返回最终的return发送回main的内容,对吗?在这种情况下将是一个零
标签: c recursion function-definition