我无法理解这个程序是做什么的,它是一个递归的程序

cha*_*tay 3 c arrays recursion function

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

#define SIZE 10 

int whatIsThis(const int b[], size_t p);

int main(void) {
    int x;
    int a[SIZE] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    x = whatIsThis(a, SIZE);

    printf("result is %d\n", x);

    _sleep(1000 * 100);
}

int whatIsThis(const int b[], size_t p) {
    if (1 == p) {
        return b[0];
    } else {
        return b[p - 1] + whatIsThis(b, p - 1);
    }
}
Run Code Online (Sandbox Code Playgroud)

很抱歉问这个问题,但我几乎是C编程的初学者,我无法理解这个程序的逻辑,特别是return b[p-1]+ whatIsThis(b,p-1);.这是什么逻辑?

chq*_*lie 6

为了理解代码,您必须仔细阅读.发布的代码很糟糕,即使是精明的程序员也很难阅读.首先缩进和空间程序,就像我在编辑中一样.

该函数whatIsThis()首先测试它的第二个参数p是否具有该值1,并且(1 == p)在一个蹩脚的尝试中检测一个可能错误的==操作符的愚蠢反转语法:1 = p将是语法错误,而p = 1在语法上是正确的但不是测试p.

第二个参数的名称具有误导性,它是元素的数量b.因此,这将是更具可读性它命名为n,len,count...但不p被传统上用于指针.

如果此大小为1,则该函数返回数组的第一个元素的值.

如果不是,则返回最后一个元素的总和以及对同一数组和少一个元素的调用结果.

因此,该函数计算数组元素的总和.

请注意,此函数是伪造的:它无法处理0p并调用未定义的行为.更简单,更安全的版本是:

int whatIsThis(const int b[], size_t n) {
    if (n == 0) {
        return 0;
    } else {
        return b[n - 1] + whatIsThis(b, n - 1);
    }
}
Run Code Online (Sandbox Code Playgroud)

或者:

int whatIsThis(const int b[], size_t n) {
    if (n == 0) {
        return 0;
    } else {
        return b[0] + whatIsThis(b + 1, n - 1);
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,对于这样一个简单任务的递归方法是有风险的,因为它可以非常深入地进入堆栈并为中等大小的数组调用未定义的行为.编译器不能总是优化递归,特别是当它不是尾递归时,这通常不是.

  • @Haimovitz博士尊重所有人,请在纠正某人之前先测试一下.你错了:`whatIsthis(arr,3)= arr [2] + whatIThis(arr,2)= arr [2] + arr [1] + whatIsThis(arr,1)= arr [2] + arr [1] + arr [0] = 3 + 2 + 1 = 6` (2认同)