程序分析(递归)

时间:2014-02-13 17:06:47

标签: c recursion

我正在上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

2 个答案:

答案 0 :(得分:4)

如果你必须在没有任何文档的情况下分析递归代码(不常见!),一种方法是将其视为归纳证明:

1)找到基本情况(返回的情况下没有递归)。对于所有可能的分支,了解它在那种情况下的作用。

2)然后看看递归情况。使用您对基本案例的理解,了解它为倒数第二种情况所做的工作。

如有必要,请重复(2)直到您理解代码。

与其他编码惯例一样,这些更容易通过练习“阅读”

请注意,这个问题并不是特定于C语言;适当时,在大多数语言中使用递归。一些 - “功能”语言 - 特别使用它。

答案 1 :(得分:0)

尝试在纸上执行程序..逐行执行,将记录保存在堆栈图中,并删除并添加删除和添加的元素。简单的例子是通过递归来寻找阶乘。 3!= 3 *(2!) - > 3 *(2 *(1!)) - > 3 *(2 *(1))返回3 * 2-> 6

在考试中使用工作空间和铅笔来尝试执行