2013-01-01 42 views
-7

我該C遞歸函數你能幫我找到這個C遞歸函數的邏輯錯誤嗎?

#include<stdio.h> 
int main(){ 
    int entier; 
    int rlt; 
    printf("\nSaisir un entier : "); 
    scanf("%d",&entier); 
    rlt=loga(5); 
    printf("Le logarithme base 2 de %d est %d:",entier,rlt); 
} 

int loga(int x){ 
    if(x==1){ 
     return 0; 
    } 
    else { 
     return (loga(x)=1+loga(x/2)); 
    } 
} 
+10

你聽起來好像遞歸函數是某種疾病。 – jogojapan

+2

將文本翻譯成英文也不錯。雖然我們都愛說法語,但有些人不會。 – 2013-01-01 12:03:55

+1

歡迎來到堆棧溢出。忽略那些除了英語之外什麼都不會讀的沙文主義者。問題應該是英文; AFAIAC,代碼不一定是。但是,你的問題應該確定問題是什麼。例如,它應該顯示來自編譯器的錯誤消息,抱怨loga()中第二個'return'語句中的問題。由於您使用C99功能從'main()'返回0,所以在使用它之前,您還應該遵循C99規則並聲明'loga()'。 –

回答

0

遞歸部分看起來很奇怪。

int loga(int x){ 
    if(x==1){ 
     return 0; 
    } else { 
     return (1+loga(x/2)); 
//    ^^^^^^^^^^^^^ Changed here 
    } 
} 
+1

我喜歡用'^^^^^^'這種Clang風格的錯誤標識。 – 2013-01-01 12:14:07

+0

請參閱函數原型沒有定義。它也會產生一個錯誤。請看我的答案,請在下面張貼.. –

2

你需要使用它之前聲明你的函數。

#include<stdio.h> 

int loga(int x); //declaration 

int main(){ 
    //... 
} 

int loga(int x){ 
    if(x==1){return 0;} else {return (loga(x)=1+loga(x/2));} 
} 
+0

在術語上有點挑剔 - 它被稱爲「前向聲明」 –

+0

thx非常多,有點新東西^ _^ – user1940935

+2

' loga(x)='也行不通。 – TrueBlue

1

您正在分配到non-lvalueloga(x)=1+loga(x/2)。這是毫無意義和無效的。

+0

任何一個有解決方案? – user1940935

+0

@ user1940935:是的,用戶[timrau](http://stackoverflow.com/users/718379/timrau)有一個[解決方案](http://stackoverflow.com/a/14110270/15168)。 –

+0

@JonathanLeffler假設這是程序的*真實意圖... – SomeWittyUsername

-1

我想,下面的代碼將解決你的問題。

#include<stdio.h> 
int loga(int); 

int main() 
{ 
    int var; 
    int result; 
    printf("\nPlease enter a value : "); 
    scanf("%d",&var); 
    result=loga(5); 
    printf("The logarithm to the base 2 for %d is %d:",var,result); 
} 

int loga(int x) 
    { 
    if(x==1) 
     { 
     return 0; 
     } 
    else 
     { 
     return (1+loga(x/2)); 
     } 
     } 

此代碼應正確執行。

+0

我試圖找到日誌(10),並且您的程序將答案打印爲2. – user93353

+0

@ user93353 - 我只是用SO問題糾正了錯誤。我沒有對他使用的配方做任何改變。 –