2016-03-21 16 views
0

Fibonacci dizisini çalışmak için aşağıdaki kodla geldim. Benim asıl sorum, neden geri dönüş değeri nedir? a==1 olduğunda bir sonuç döndürmek için bir satır eklediyse, doğru dönüş değerini elde etmeyi anlarım, ancak olduğu gibi çalışamıyorum. Bunun dışında normal özyinelemeli algoritmayı kullanmanın herhangi bir avantajı olup olmadığını bilmek isterim?C'deki Fibonacci algoritması - neden bu bir dönüş değeri olarak çalışıyor?

int calculate(int a,int result,int old) 
{ 

    if (a>0) 
    { 
     printf("%d ",result); 
     return calculate (a-1,result+old,result); 
    } 

} 

int main() 
{ 
    int number,choice; 
    printf("To start from 0 enter 0. To start from one enter any other number.\n"); 
    scanf("%d",&choice); 
    printf ("Choose the number of times you wish to go for.\n"); 
    scanf("%d",&number); 
    if (choice==0) 
    { 
     printf("Result= %d",calculate(number,0,1)); 
     return 0; 
    } 
    printf("Result= %d",calculate(number,1,0)); 

    return 0; 

} 
+1

'Hesapla 'her zaman bir değer döndürmediğinden, kodunuz yanlış biçimlendirilir. “0” veya “a” sı sıfır veya negatif olduğunda davayı ele alacak bir şey olmalıdır. –

+2

Yani, "a == 0" durumunda, bir şey döndürmeyi unuttuğunuz yerde, nasıl büyülü bir şekilde çalışır? Ne döneceğini söylemedin, bu yüzden rastgele bir şey döndü (bu, tanımlanmamış davranış * diye adlandırılır), ama iyi şanslar (ya da aslında, şanssızlık) ile istediğin şeyi geri getirdi. Açıkçası, buna bağlı olmak istemezsiniz. İyi derleyiciler bu konuda sizi uyarır. –

+1

İyi bir derleyici, en azından hesaplama işlevi hakkında bir uyarı üretmez - tüm kod yollarının satırları boyunca bir değer döndürmez mi? – Skizz

cevap

0

Bu durumda bir değer alması ve bir tane de döndürmesi önerilir.

/*Recursive fibonacci function*/ 
#include <stdio.h> 

long fibonacci(int); 

int main() 
{ 

    long result; 
    int number; 

    printf("Enter an interger: "); 
    scanf("%d", &number); 
    result = fibonacci(number); 
    printf("Fibonacci(%d) = %ld\n", number, result); 

    getchar(); 
    return 0; 


} 

//Recursive definition of function fibonacci 
long fibonacci(int n) 
{ 
    if(n == 0 || n == 1) 
     return ((long) n); 
    else 
     return fibonacci(n - 1) + fibonacci(n - 2); 
} 

yinelemeli yöntemler büyük ama çok fazla bellek tüketir ve yinelemeli seçenek Fibonacci serisini çözmek için bu kadar verimsiz görünmektedir: aşağıdaki gibi kod basitleştirmek başladı. "C/C++" temelli

. Deitel & Deitel