我对递归函数有疑问。该程序应该计算 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");