如何知道数组中偶数索引值之和与奇数索引值之和之间的差异(递归代码)

Posted

技术标签:

【中文标题】如何知道数组中偶数索引值之和与奇数索引值之和之间的差异(递归代码)【英文标题】:how to know the difference between the sum of the values of the even index and the sum of the values of the odd index in an array (recursive code) 【发布时间】:2022-01-15 09:58:56 【问题描述】:

(仅限递归解决方案)我正在使用函数:int diff(char str[],int i) 输入是字符串:123,偶数索引中的值的总和是 1+3=4 奇数索引中的值之和为 2 所以数组中偶数索引的值之和与奇数索引的值之和之间的差:4-2= 2。

我主要写了这个,但它不正确,我该如何修复我的代码? :

printf("Enter a string:");
if(scanf("%s",str)!=1)

    printf("Input error");
    return 1;


printf("The difference is: %d", diff(str, 0));
return 0;

在主要功能之外:

int diff (char str[], int i)

    if(str[i]=='\0' || i>=100)
        return 0;
    if(i%2==0)
        return (str[i]+diff(str,i+1));
    else
        return (-str[i] +diff(str,i+1));

【问题讨论】:

借此机会学习如何调试您的程序。例如,在监视变量及其值的同时,使用调试器逐语句逐句执行代码。对于每个递归调用,在纸上写下 istr[i] 的当前(递归调用之前)值,然后进入调用。 【参考方案1】:

编写的代码不起作用,因为它没有将str 中保存的字符代码转换为 0-9 范围内的整数值。

如果 diff 函数的输入是“12345”,那么使用调试器检查 str[0]、str[1]、...str[5] 的值或将它们打印出来都会显示它们是(假设是 ASCII 派生编码):

49 50 51 52 53

幸运的是,(感谢用户 @SomeProgrammerDude 指出这一点),C 标准要求(例如:ISO/IEC 9899:TC3 §5.2.1,第 3 段):

在源基本字符集和执行基本字符集中,上述十进制数字列表中0之后的每个字符的值都应比前一个字符的值大1。

这实际上意味着您可以通过减去 '0' 将字符 '0'、'1'、...、'9' 转换为它们的等效值。

int value = str[i] - '0';

将此添加到代码中会得到diff 的工作版本:

int diff (char str[], int i)
  
    if(str[i]=='\0' || i>=100)
        return 0;
    int value = str[i] - '0';
    if(i%2 == 0)
        return (value + diff(str, i+1));
    else
        return (-value + diff(str, i+1));

【讨论】:

value 的定义(或至少分配给)应该在您检查字符串终止符或越界索引之后。 我运行了你现在给我的代码,它是正确的,但我不知道为什么有必要确保值是从 0 到 9?虽然我只是输入了从 0 到9 作为我的输入。 是的,你是对的。 (虽然它不会导致错误的答案。只是不需要的代码执行) @dany 您仍然需要将字符串中保存的字符代码转换为值。字符串“123”通常包含字符代码 49、50、51。要将这些转换为 1、2、3,您需要减去 '0' 的字符代码(在现代计算机上几乎总是 48),因此 49-48、50-48、51-48 -> 1、2、3 @dany '1' - '0' == 1 是 C 语言规范的要求。它必须适用于所有实现 C 的系统,无论字符编码如何。但是,该要求仅适用于数字,而不适用于其他类型的字符。【参考方案2】:

另一种方法可能是:

int diff (const char str[])

    if (str[0] == '\0')
        return 0;
    if (str[1] == '\0')
        return str[0] - '0';

    return str[0] - str[1] + diff(str + 2);

【讨论】:

以上是关于如何知道数组中偶数索引值之和与奇数索引值之和之间的差异(递归代码)的主要内容,如果未能解决你的问题,请参考以下文章

编写程序,计算数组中奇数之和和偶数之和。

用php打出1到100之间的偶数之和,还有奇数之和,还有定义一个变量,用for循环打出来,总共三个

C语言怎样求1到100偶数之和

C语言怎样求1到100偶数之和?

使用for循环结构编写程序计算1到100之间的奇数之和、偶数之和,输出格式为“1到100奇数和=xxx;

编程:键盘输入正整数m和n(m<n),计算m~n之间所有奇数之和x与偶数之和y。