c - 我不明白这个程序是做什么的,它是一个递归程序

标签 c arrays function recursion

#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);
    }
}

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

最佳答案

为了理解代码,您必须仔细阅读它。发布的代码呈现得很糟糕,这使得它难以阅读,即使对于精明的程序员也是如此。首先按照我在编辑时的方式缩进和分隔程序。

函数 whatIsThis() 首先测试其第二个参数 p 是否具有值 1,使用愚蠢的倒置语法 ( 1 == p) 尝试检测可能错误输入的 == 运算符:1 = p 将是语法错误,而 p = 1 在句法上是正确的,但不是对 p 的测试。

第二个参数的名称具有误导性,它是 b 中元素的数量。因此,将其命名为 nlencount... 而非 p 会更具可读性这通常用于指针。

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

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

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

请注意,此函数是伪造的:它无法处理 p0 值并调用未定义的行为。一个更简单和更安全的版本是:

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

或者:

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

当然,对于这样一个简单的任务,使用递归方法是有风险的,因为它可能会递归到堆栈的深处,并为中等大的数组调用未定义的行为。编译器不能总是优化递归,尤其是当它不是尾递归时,而这通常不是。

关于c - 我不明白这个程序是做什么的,它是一个递归程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41016219/

相关文章:

c++ - 通过函数传递字符串流值,C++

C 多维 char 数组 - 赋值从指针生成整数,无需强制转换

c++ - 制作 Makefile

c - 链表冒泡排序

JavaScript 数组填充

java - 是否可以优化此功能?

c - 在 C 中有条件地包含数据表列的最佳方法

python - numpy,连接或初始化之间的循环选择

java - 如何使用 JavaScript 访问保存在请求范围内的数组或列表?

sql-server - 如何调用返回表数据类型的用户定义函数