C语言中的递归问题(数组中奇数之和)
我对递归函数有疑问。程序应该计算n个奇数整数的和,并且每次我们找到和时,我们必须打印以下内容: 例如,如果用户给出5个数字(5,4,3,2,1),列表将为: 5 4 3 2 1 然后它将打印: 5[0](是)4[5](是)3[5](是)2[8](否)1[8](否) 首先,它打印数字,然后在[]中打印下一个奇数的和,如果每个节点中的数字^2大于其下一个奇数的和,则在括号的末尾打印a(是)或(否)。就像第一个,5>0,所以是肯定的 到目前为止,我已经写了这篇文章,但我无法打印,有什么遗漏吗C语言中的递归问题(数组中奇数之和),c,recursion,sum,C,Recursion,Sum,我对递归函数有疑问。程序应该计算n个奇数整数的和,并且每次我们找到和时,我们必须打印以下内容: 例如,如果用户给出5个数字(5,4,3,2,1),列表将为: 5 4 3 2 1 然后它将打印: 5[0](是)4[5](是)3[5](是)2[8](否)1[8](否) 首先,它打印数字,然后在[]中打印下一个奇数的和,如果每个节点中的数字^2大于其下一个奇数的和,则在括号的末尾打印a(是)或(否)。就像第一个,5>0,所以是肯定的 到目前为止,我已经写了这篇文章,但我无法打印,有什么遗漏吗 int
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 这决定了递归函数的行为。它是先称自己,还是在最后称自己?在您的情况下,头值将首先处理,因此递归调用将在数字处理后完成。最后 那么您的测试
如果(ptr!=NULL)
应该只影响递归调用,而不是整个函数体
^
运算符是独占的或在C。。。可能不是你想要的(虽然可以使用它,但不是那样)。要测试一个数字是否为奇数,只需检查其第一位(使用&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");
您希望
(ptr->next)^2>k
测试做什么?该代码甚至都不会编译,是吗?“4”应该打印“否”,否?我错了,如果用户给出(1,2,3,4,5),列表将是:1,2,3,4,5,但在最后,它会打印;5[0](是)4[5](是)3[5](是)2[8](否)1[8](否),放弃反向相位,您可能可以修改上述代码以满足新要求,对吗?