C 中的递归问题(数组中奇数的总和)



我对递归函数有疑问。该程序应该计算 n 个奇数整数的总和,重点是每次我们找到总和时,我们必须打印以下内容:

例如,如果用户给出 5 个数字 (5,4,3,2,1(,则列表将为:

5 4 3 2 1

然后它将打印:

5[0] (是( 4[5] (是( 3[5] (是( 2[8] (否(1[8] (否(

首先,它打印数字,然后在 [] 中打印下一个奇数的总和,如果每个节点中的数字^2大于其下一个奇数的总和,则在括号末尾打印 (Yes( 或 (No(。就像第一个一样,5>0,所以它是肯定的。

到目前为止我已经写了,但我无法打印它,有什么遗漏吗?

int checkSumOfOdds(struct list *ptr) {
int k=0;
if (ptr != NULL){
k = checkSumOfOdds(p->next);
if((ptr->next)^2 > k){
printf(" %d [%d] (YES)",ptr->value, k);}
else{
printf(" %d [%d] (YES)",ptr->value, k);}
k += ptr->value;
return k;
}
return 0;
}

根据问题陈述,要显示的值是从第一个输入到最后一个输入。"5"先出现,然后是"4"...

这决定了递归函数的行为方式。它是先称呼自己,还是在最后称呼自己?在您的情况下,首先处理 head 值,因此递归调用将在处理数字后完成。最后。

然后,您的测试if (ptr != NULL)应该只影响递归调用,而不是整个主体。

^运算符在 C 中是独占的 OR...可能不是你想要的(虽然可以使用它,但不是那样(。要测试一个数字是否奇数,只需检查它的第一个位(带& 1(,或检查N % 2是否> 0

由于数字是提前处理和显示的(因为递归调用在末尾(,因此您可以将总和与调用一起携带。

我猜要显示的总和应该从当前数字开始(或者,作为练习,简单地延迟求和......

应该工作的代码示例

int checkSumOfOdds(struct list *ptr, int sum) {
int isodd = ptr->value & 1;
if (isodd) sum += ptr->value;
printf("%d[%d](%s) ", ptr->value, sum, isodd ? "Yes":"No");
return ptr->next ? checkSumOfOdds(ptr->next, sum) : sum;
}

被召唤

checkSumOfOdds(headOfList, 0);
printf("n");

最新更新