2011-11-04 46 views
0

担心我可能会超出我的另一个问题(尽管这是一个新问题)我仍然问这个问题。为什么递归函数在峰值后向下计数?

我有这样的代码:

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; 
} 

的问题是,总之,这计数1,对于每一个递归运行,返回错误值。通过这样做打印每个递归来看,它给出结果:

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

,这是伟大的,但通过设置为外循环打印出的总和(右前收益之和;)时,它已经达到顶峰发生相反的情况,所以它这样做:

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

return sum; // = 1 

这显然是错误的,因为我想总数,而不是最低。我的返回值是否错误?我试过把它放在递归调用之后(在循环内部),无济于事。

+0

'blob_count'每次调用时都会对新的'sum'进行操作。您可能想要传递一个指针而不是其值。 – pmg

回答

1

好吧,让我们摆脱额外的位,并简化您的问题到要点。 您有:

int blob_count(int sum) 
{ 
    sum++; 

    if (sum < 10) 
     blob_count(sum); 

    return sum; 
} 

如果您在return然后将它在最里面的递归(其中sum == 10),那么它将return到一个新的水平在哪里sum == 9,打印先叫前添加printf("sum==%d\n", sum)那,回到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; 
} 

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

+0

史诗般的萌芽!事实证明,我的问题具体是我没有设置sum = blob_count(sum),这反过来导致我的返回值失配。不胜感激。 – Dennis

+0

我认为更一般地说,你的问题是,当你不真正理解它时,你试图使用递归。但很高兴有所帮助。:) – GrahamS

+0

这可能是真的,但我想我需要学习软件工程5年的一个原因,并看到我已经在我的大学2个月左右,我真的不希望知道所有的东西,尤其是不是关于递归看到我已经有一个2小时的讲座了。 – Dennis

1

pmg说什么。对于每个递归调用,总和的当前值被复制,副本被传递给递归调用。如果你想修改函数中的对象,你必须传递一个指向这些对象的指针,而不是对象本身。

+0

指针对我来说还是比较新的,你有什么机会可以举个简单的例子吗?似乎无法得到它的工作。 – Dennis

+1

@Kola GrahamS在他的回答中有一个例子。正如他所说的,在这里可能更容易将blob_count的返回值赋值为sum。但是,如果您需要修改多个参数,则需要通过指针,仔细研究其示例以了解如何执行该操作。 –