您至少得到了一個有助於解釋代碼行爲的答案。
我想通過其他路徑提供幫助。兩者一起爲您提供不同的觀點。
爲此,我提供了一個由儀器增強的代碼版本,它可以更詳細地告訴您發生了什麼。
這允許你玩代碼並觀察,這會給你真正有用的答案。
注:
- 的
for(c
線僅用於暗示縮進;
我選擇不使用此功能,感覺它使有趣的函數調用
- 我加了一個參數「嵌套」更加突出,它是
- 使(希望有用)的一部分輸出
- 顯示,通常遞歸嵌套有一定的影響
- 我介紹了一個局部變量「J」,
顯示什麼用reutrn值在大多數情況下 發生
代碼:
#include <stdio.h>
int recur(int i, int nesting)
{ int c;
for(c=0;c<nesting;c++) { printf(" ");}
printf("recur[%d](%i)", nesting, i);
if (i < 3)
{ printf("i <3, calling recur[%d](%d)\n", nesting+1, i+1);
recur(i + 1, nesting+1);
for(c=0;c<nesting;c++) { printf(" ");}
printf("returning 10 from recur[%d], with i==%d\n", nesting, i);
return 10;
}
else if (i < 5)
{
int j=0;
printf("i <5, calling recur[%d](%d)\n", nesting+1, i +1);
j=recur(i + 1, nesting+1);
for(c=0;c<nesting;c++) { printf(" ");}
printf("ignored return value from recur[%d](%d) is %d", nesting+1, i+1, j);
}
printf("\n");
for(c=0;c<nesting;c++) { printf(" ");}
printf("returning i from recur[%d], with i==%d\n", nesting, i);
return i;
}
int main(void)
{
int i = 0;
i = recur(i, 0);
printf("the last return value did not get ignored: i = %d\n", i);
return 0;
}
輸出:
recur[0](0)i <3, calling recur[1](1)
recur[1](1)i <3, calling recur[2](2)
recur[2](2)i <3, calling recur[3](3)
recur[3](3)i <5, calling recur[4](4)
recur[4](4)i <5, calling recur[5](5)
recur[5](5)
returning i from recur[5], with i==5
ignored return value from recur[5](5) is 5
returning i from recur[4], with i==4
ignored return value from recur[4](4) is 4
returning i from recur[3], with i==3
returning 10 from recur[2], with i==2
returning 10 from recur[1], with i==1
returning 10 from recur[0], with i==0
the last return value did not get ignored: i = 10
注:
的recur[n](m)
當然沒有C語法。
它只是表示在參數「m」的嵌套級別「n」上調用函數「recur」。
(特別是不要將「[]」與數組混淆,它們不存在。)
在遞歸函數中,遞歸調用返回的值會發生什麼?你只需把它們扔掉。另外,我建議你使用調試器來遍歷代碼,進入遞歸調用,看看會發生什麼。 –
對不起,我的意思是'返回我'不'返回0' ...我編輯我的代碼 – nounoursnoir
編寫一個沒有用處的函數,並且你會從中學到很多有用的東西。 –