我正在上C语言课程,讲师喜欢在考试中提供一个非常复杂的递归程序,并询问函数的调用是做什么的。 我想知道一些解决这类问题的方法/技巧。 这是一个问题,例如:
以下内容是什么? (考试中没有电脑)
#include <stdio.h>
#include <conio.h>
int* what(int *arr, int *maxLen, int *curLen)
{
int *res;
if (*arr == -1){
*maxLen = *curLen = 0;
return arr;
}
if (arr[1] == -1 ){
*maxLen = *curLen = 1;
return arr;
}
if (arr[2] == -1 ){
*maxLen = *curLen = 2;
return arr;
}
res = what(arr+1, maxLen, curLen);
if ((arr[1] - arr[2]) * (*arr - arr[1]) > 0 ){
*curLen = *curLen + 1;
if ( *curLen >= *maxLen){
*maxLen = *curLen;
res = arr;
}
}else
*curLen=2;
return res;
}
void main(){
int cur, max, i, j, *res, a[][20]= {{5,-1}, {5,6,-1},
{1,4,5,9,7,6,4,6,9,8,5,4,1,4,5,6,-1}};
for(i=0; i<3; i++){
res = what(a[i], &max, &cur);
printf("max=%d, ",max);
for ( j = 0 ; j < max ; j++)
printf("%d ", res[j]);
('\n');
}
}//end
答案 0 :(得分:4)
如果你必须在没有任何文档的情况下分析递归代码(不常见!),一种方法是将其视为归纳证明:
1)找到基本情况(返回的情况下没有递归)。对于所有可能的分支,了解它在那种情况下的作用。
2)然后看看递归情况。使用您对基本案例的理解,了解它为倒数第二种情况所做的工作。
如有必要,请重复(2)直到您理解代码。
与其他编码惯例一样,这些更容易通过练习“阅读”
请注意,这个问题并不是特定于C语言;适当时,在大多数语言中使用递归。一些 - “功能”语言 - 特别使用它。
答案 1 :(得分:0)
尝试在纸上执行程序..逐行执行,将记录保存在堆栈图中,并删除并添加删除和添加的元素。简单的例子是通过递归来寻找阶乘。 3!= 3 *(2!) - > 3 *(2 *(1!)) - > 3 *(2 *(1))返回3 * 2-> 6
在考试中使用工作空间和铅笔来尝试执行