2012-09-04 45 views
-3

可能重複:
What is really happening in this code?此代碼是給人一種荒謬的答案

我有一個代碼,其中包括一個遞歸函數。我已經浪費了不少時間遞歸,但我仍然無法得到它,真正做到:

#include<stdio.h> 

count(int); 

main(){ 
    int x=10,z; 
    z=count(x); 
} 
count(int m){ 
    if(m>0) 
     return count(m-1); 
} 

count被稱爲首次用爭論10,它滿足的條件和遞歸開始。當一個函數自動調用時會發生什麼?我沒有明白。語句return count(m-1)是什麼意思?它在哪裏轉移控制權?

+2

在內置函數的紙上畫出它。 「荒謬的答案」你也沒有擴大。什麼荒謬的呢?它是什麼? – chris

+0

我知道'return'的意思,但我不能以遞歸的方式得到它 –

+0

我想打印0到10的數字,但它打印9939像值 –

回答

1

您需要count返回m <= 0。你應該聲明返回類型爲count,並用-Wall進行編譯,這樣編譯器將幫助你在代碼中發現錯誤。

5

函數count的返回值未定義,因爲如果(m <= 0)爲真,則沒有默認返回值。

C11,第6.9.1函數定義

如果達到終止函數的}和 函數調用的值由主叫方,該行爲是不確定的。

此外,要了解一個遞歸函數是如何工作的,你必須要一張紙和嘗試自行執行的代碼(見here)。

0

遞歸意味着如果函數是尾遞歸,函數將自行調用,大部分在自身的末尾。

所以你的計數函數檢查輸入參數是否> 0,然後如果是,它會調用count(m-1)。現在它開始於count的頂部,其中m = 9。它做同樣的事情,然後調用計數與m = 8等。

直到達到結束條件,通常應明確照顧您的功能,如if (m == 0) return m;或一些這樣的事情。此時遞歸結束,函數終止。

此外,count應該有一個返回類型,如int count (int m)

0

這句話是什麼返回計(M-1)是什麼意思?它在哪裏轉移控制權?

這似乎是你唯一的問題。

這意味着它正在調用值爲m-1的「count」。所以如果m是10,那麼它就是用9調用「count」。

它將控制遞歸地傳遞給count方法。

您也沒有「count」方法中每個可能路徑的返回值。 如果m是< = 0,會發生什麼情況?