gpt4 book ai didi

c - 为什么递归函数在达到峰值后会向下计数?

转载 作者:行者123 更新时间:2023-11-30 14:27:19 25 4
gpt4 key购买 nike

由于担心我可能会超越我的另一个问题(尽管这是一个新问题),我仍然问这个问题。

我有这个代码:

int blob_count(int y, int x, int gridCopy[][5], int sum){

//Local vars
int posX, posY;

//Find the position 1 behind and 1 above the starting point, and start the loop there
for(posX = -1;posX <=1; posX++){
for(posY = -1; posY <= 1; posY++){
if((y + posY) >= 0 && (x + posX) >= 0){
if((y + posY) <= 5 && (x + posX) <= 5){
if(gridCopy[posY+y][posX+x] == 1){
//Set the starting point to 0 (so it wont get calculated again)
gridCopy[posY+y][posX+x] = 0;



y = posY+y;
x = posX+x;

sum++;
blob_count(y, x, gridCopy, sum);
}
}
}
}
}

return sum;
}

问题在于,每次递归运行时,sum 都会加 1,但会返回错误的值。通过为每次递归运行进行打印,它会给出结果:

sum = 1  
sum = 2
sum = ...
sum = n

但是,通过设置在 for 循环外部打印总和(就在 return sum 之前;),这很棒,当它达到峰值时,会发生相反的情况,因此它会这样做:

sum = n  
sum = ...
sum = 2
sum = 1

return sum; // = 1

这显然是错误的,因为我想要的是总数,而不是最低的。我的返回值是不是放错地方了?我尝试将它放在递归调用之后(循环内),但没有成功。

最佳答案

好吧,让我们去掉多余的部分,将您的问题简化到最本质的部分。你有:

int blob_count(int sum)
{
sum++;

if (sum < 10)
blob_count(sum);

return sum;
}

如果您在 return 之前添加 printf("sum==%d\n", sum) ,那么它将首先在最内层递归处调用(其中sum == 10),然后它会返回到下一个级别,其中sum == 9,打印它,返回到sum == 8 > 等等。

如果您将其放在对 blob_count(sum) 的递归调用之前,那么您将在向下递归之前打印这些值,因此它们以 sum==0, sum == 开头1 等等。

<小时/>

如果您希望 sum 成为递归达到的最深级别,那么您可以通过返回值将其传回,如下所示:

int blob_count(int sum)
{
sum++;

if (sum < 10)
sum = blob_count(sum);

return sum;
}

或者您可以通过指针传递它,以便修改原始变量:

void blob_count(int* sum)
{
*sum++;

if (*sum < 10)
blob_count(sum);

return;
}

第一个可能是您正在寻找的解决方案。

关于c - 为什么递归函数在达到峰值后会向下计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8009470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com