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

#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编程的初学者,我无法理解这个程序的逻辑,特别是返回b [p-1] whatIsThis(b,p-1);.这是什么逻辑?

最佳答案

What is this?

它是一个具有未定义行为的函数.:)

当第二个参数等于0时,函数尝试访问位置p-1中的内存,通常,类型size_t是无符号类型,将转换为可以存储在size_t类型的对象中的最大值.

此外,由于在函数内部使用了加法运算,因此可能存在两个大数的溢出.因此函数的返回类型应该是其他更大的整数类型.

所以让我们重写一下去除这些缺点的功能.逻辑将是相同的.

long long int whatIsThis( const int a[], size_t n ) 
{
    return n == 0 ? 0 : a[n-1] + whatIsThis( a, n - 1 );
}

或者不使用三元(条件)运算符,函数看起来像

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

现在让我们考虑一下这个函数是如何工作的.如果你有这样的数组

int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

您可以通过以下方式想象它(尽管此代码不会被编译)

int a[10] = { { 1, 2, 3, 4, 5, 6, 7, 8, 9 }, 10 };

或者像这样

int a[10] = { a1[9], 10 };

其中a1 [9]是9个元素的数组

int a1[9] = { 1, 2, 3, 4, 5, 6, 7, 8, 9  };

反过来,数组a1可以想象

int a1[9] = { a2[8], 9 };

其中a2是

int a2[8] = { 1, 2, 3, 4, 5, 6, 7, 8  };

等等,最后我们会得到

int a8[2] = { a9[1], 2 };

其中a9是

int a9[1] = { 1 };

那么这个功能有什么作用呢?

对于像想象的阵列一样

int a[10] = { { 1, 2, 3, 4, 5, 6, 7, 8, 9 }, 10 };

或者喜欢

int a[10] = { a1[9], 10 };

该函数添加a1 [9] 10

反过来想象的阵列a1

int a1[9] = { 1, 2, 3, 4, 5, 6, 7, 8 }, 9  };

或者喜欢

int a1[9] = { a2[8], 9 };

该函数计算a2 [8] 9

如果用a2 [8] 9替换表达式a1 [9] 10中的a1 [9],那么我们将得到a2 [8] 9 10,依此类推.

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

转载注明原文:我无法理解这个程序是做什么的,它是一个递归的程序 - 代码日志