2014-02-06 191 views
0
計數的整數位數

我的代碼如下:中位數的整數通過遞歸

#include <iostream> 
using namespace std; 

int countNum(int n,int d){ 
    if(n==0) 
    return d; 
    else 
    return (n/10,d++); 
} 
int main(){ 
    int n; 
    int d; 
    cout<<"Enter number"<<endl; 
    cin>>n; 
    int x=countNum(); 
    cout<<x; 
    return 0; 
} 

/計數數字我不能找出錯誤,它說, :太少函數參數`int countNum(int,int)' 什麼是問題?

+4

看看'countNum(int n,int d)'。然後看'countNum();'。現在回頭看看'countNum(int n,int d)'。看到問題了嗎? –

+0

這是作業嗎?使用遞歸爲此(而不是利用尾端遞歸),將氾濫的調用堆棧沒有很好的理由... –

回答

2

int x=countNum();調用者函數應該將實際參數傳遞給調用函數。你已經定義了函數countNum(int, int),這意味着它將從調用函數接收兩個int作爲參數,所以調用者應該通過它們,在你的情況下丟失它們。這就是錯誤太少的原因。

+0

好的謝謝它的工作:) –

0

您的代碼在這裏:

int x=countNum(); 

countNum需要用兩個整數調用。例如

int x=countNum(n, d); 
0

因爲您尚未將參數傳遞給countNum函數。使用它像int x=countNum(n,d);

6

因爲你聲明的函數取兩個參數:

int countNum(int n,int d){ 

和你逝去無在:

int x = countNum(); 

你大概意思這樣稱呼它,而不是:

int x = countNum(n, d); 

而且這樣的:

return (n/10,d++); 

也許應該是這樣的:

return countNum(n/10,d++); 

而且你沒有初始化你nd變量:

int n; 
int d; 

最後你完全不需要d參數。這裏有更好的版本:

int countNum(int n){ 
    return (n >= 10) 
     ? 1 + countNum(n/10) 
     : 1; 
} 

and here的工作例子。

+0

謝謝我得到它 –

0

將其更改爲:

int x=countNum(n,0); 

你並不需要通過在d,你可以通過0作爲種子。

也改變countNum這樣:

int countNum(int n,int d){ 
    if(n==0) 
    return d; 
    else 
    return coutNum(n/10,d+1); // NOTE: This is the recursive bit! 
} 
+0

當我最後傳遞參數和我的代碼編譯沒有錯誤,但當我運行我的代碼,但輸入數字後,按下輸入,但按下後輸入黑色輸出屏幕消失爲什麼是這樣?是我的代碼罰款嗎?或者我必須cout別的東西? –

+0

這是因爲你的程序寫入控制檯然後退出。它退出時關閉控制檯。您可以在'return'之前添加另一個讀取來暫停程序,或者在'return'語句中放置一個斷點,以便在程序退出前查看輸出。 – Sean

+0

那是什麼systempause?什麼是實際的東西..感謝 –

0
#include <iostream> 
using namespace std; 

int countNum(int n,int d){ 
    if(n<10) 
     return d; 
    else 
     return countNum(n/10, d+1); 
} 
int main(){ 
    int n; 
    cout<<"Enter number"<<endl; 
    cin>>n; 
    int x=countNum(n, 1); 
    cout<<x; 
    return 0; 
} 
+0

你爲什麼不[運行](http://ideone.com/PtzCKU)它然後發佈? – P0W

+0

它沒有給出錯誤,但當我運行它並輸入數字,但輸入數字後,屏幕消失?爲什麼這樣?也告訴我,在countNum(n,d)你已經傳遞了n和d個參數,並且在調用函數中你已經採用了一個參數0。 –

+0

對不起。固定和測試。 –

-2

你的函數不正確地寫入。例如,它不清楚爲什麼它有兩個參數或它本身是遞歸調用的。

我會寫它通過以下方式

int countNum(int n) 
{ 
    return 1 + ((n /= 10) ? countNum(n) : 0); 
} 

甚至倒不如將其定義爲

constexpr int countNum(int n) 
{ 
    return 1 + ((n/10) ? countNum(n/10) : 0); 
} 
+4

Aaaaaand [segmentation fault](http://coliru.stacked-crooked.com/a/5fb​​4f9646bce4089)。 – Shoe

+0

我不懷疑你會這樣寫,所以嚴格來說,你的回答是沒有錯的。不幸的是,這是一種不正確的方式。 –

+0

@Jefffre我犯了一個錯字。我點了我的帖子。 –

0

假設這不是一個任務,有更好的方法來做到這一點(只是幾個例子):

轉換爲字符串

unsigned int count_digits(unsigned int n) 
{ 
    std::string sValue = std::to_string(n); 
    return sValue.length(); 
} 

unsigned int count_digits(unsigned int n) 
{ 
    unsigned int cnt = 1; 
    if (n > 0) 
    { 
     for (n = n/10; n > 0; n /= 10, ++cnt); 
    } 
    return cnt; 
} 

尾部遞歸

unsigned int count_digits(unsigned int n, unsigned int cnt = 1) 
{ 
    if (n < 10) 
     return cnt; 
    else 
     return count_digits(n/10, cnt + 1); 
} 

注:由於車尾遞歸優化開啓,你的編譯器將其轉化成你的循環 - 預防調用堆棧的不必要氾濫。

+0

這是我們的實驗室活動只有通過遞歸..謝謝反正 –