我想记录不同递归函数的调用次数,而不需要调用次数作为函数的返回值。
例如,我想知道对于不同的密钥进行二进制搜索会发生多少函数调用。
int binarySearch (int key, int array[], int lo, int hi, int *recursiveCalls) {
recursiveCalls++;
if (lo > hi) return -1;
else if (lo == hi) {
if (key == array[lo]) return lo;
else return -1;
}
else {
int mid = (lo+hi)/2;
if (key < array[mid])
return binarySearch(key, array, lo, mid-1, recursiveCalls);
else if (key > array[mid])
return binarySearch(key, array, mid+1, hi, recursiveCalls);
else
return mid;
}
}
int main(int argc, char const *argv[]) {
int array[10] = {1, 4, 6, 7, 10, 13, 15, 17, 18, 21};
int *recursiveCalls = 0;
int index = binarySearch (13, array, 0, 9, recursiveCalls);
printf ("Number of recursive calls = %d times.\n", *recursiveCalls);
return 0;
}
但是,这会导致分段错误。
答案 0 :(得分:2)
你不能在主指针中传递指向0的指针。用以下代码修复:
#include<stdio.h>
int binarySearch (int key, int array[], int lo, int hi, int *recursiveCalls) {
(*recursiveCalls)++;
if (lo > hi) return -1;
else if (lo == hi) {
if (key == array[lo]) return lo;
else return -1;
}
else {
int mid = (lo+hi)/2;
if (key < array[mid])
return binarySearch(key, array, lo, mid-1, recursiveCalls);
else if (key > array[mid])
return binarySearch(key, array, mid+1, hi, recursiveCalls);
else
return mid;
}
}
int main(int argc, char const *argv[]) {
int array[10] = {1, 4, 6, 7, 10, 13, 17, 16, 18, 21};
int recursiveCalls = 0;
int index = binarySearch (13, array, 0, 9, &recursiveCalls);
printf ("Number of recursive calls = %d times.\n", recursiveCalls);
return 0;
}
答案 1 :(得分:1)
你被C语言中那些令人讨厌的特性所欺骗。
通常,可以指定给指针的值必须是指针类型,与指定的指针类型相同。 (或者可以隐式转换为它,但让我们保持简单。)因此,例如,您不能说char* p = 'a';
因为p
属于char*
类型,而'a'
}类型为char
。 (一个是指针,另一个不是。)
然而,C做了一个例外:整数常数为零。将整数常量0指定给指针时,C将指针设置为NULL。
因此,您尝试将recursiveCalls
指针设置为指向初始值通常会被编译器标记为错误,因为您试图将int
分配给{{ 1}},但它没有被标记,因为C专门处理int*
整数文字,将指针设置为NULL。
所以,你的情况下的修复是先分配一个这样的变量:0
,然后设置你的指针指向它,如下所示:int recursiveCallCount; recursiveCallCount = 0;