int FibonacciArray(int n){
if(n<=2){
return 1;
}
else {
return FibonacciArray(n-1) FibonacciArray(n-2);
}
}
是否有計算遞回呼叫的功能?
uj5u.com熱心網友回復:
一種解決方案是使用靜態本地整數計數器(如果您只想在內部訪問它)或全域整數計數器(如果您希望它在外部訪問),然后每次呼叫它時在函式內部遞增該計數器。你可以試試這個!
int GlobalCount = 0 ;
int FibonacciArray(int n)
{
static int LocalCounter = 0;
LocalCounter ;
GlobalCount ;
if(n<=2)
{
return 1;
}
else
{
return FibonacciArray(n-1) FibonacciArray(n-2);
}
}
uj5u.com熱心網友回復:
該函式可以回傳一個結構,該結構將包含結果斐波那契值和函式呼叫的次數。
請注意,該函式應處理無符號整數型別的值。第一個斐波那契數也等于0。并且當n等于2函式時稱為3次數:對于初始值,2然后遞回地對于值1和值0。
這是一個演示程式。
#include <stdio.h>
struct FibonacciResult
{
unsigned int value;
unsigned int n_calls;
};
struct FibonacciResult Fibonacci( unsigned int n )
{
if ( n < 2 )
{
struct FibonacciResult result = { .value = n, .n_calls = 1 };
return result;
}
else
{
struct FibonacciResult result1 = Fibonacci( n - 1 );
struct FibonacciResult result2 = Fibonacci( n - 2 );
result1.value = result2.value;
result1.n_calls = result2.n_calls 1;
return result1;
}
}
int main( void )
{
for (unsigned int n = 0; n < 10; n )
{
struct FibonacciResult result = Fibonacci( n );
printf( "n = %u: value = %u, number of calls = %u\n",
n, result.value, result.n_calls );
}
}
程式輸出為
n = 0: value = 0, number of calls = 1
n = 1: value = 1, number of calls = 1
n = 2: value = 1, number of calls = 3
n = 3: value = 2, number of calls = 5
n = 4: value = 3, number of calls = 9
n = 5: value = 5, number of calls = 15
n = 6: value = 8, number of calls = 25
n = 7: value = 13, number of calls = 41
n = 8: value = 21, number of calls = 67
n = 9: value = 34, number of calls = 109
或者將結構的成員宣告為具有unsigned long long int 例如型別會更安全
struct FibonacciResult
{
unsigned long long int value;
unsigned long long int n_calls;
};
在這種情況下,呼叫printf看起來像
printf( "n = %u: value = %llu, number of calls = %llu\n",
n, result.value, result.n_calls );
事實上,呼叫次數也產生了一個類似于斐波那契數列的數列,增加了1. 例如 for nis equal to3你有n等于2( 3) 的呼叫次數加上n等于1( ) 的呼叫次數1加上1。
uj5u.com熱心網友回復:
僅當函式本身進行呼叫時,才稱對函式的呼叫是遞回的。因此,對遞回函式 in 的第一次呼叫main()不是遞回呼叫。此外,每次呼叫遞回函式時,如果不滿足停止條件,它會進行兩次新的遞回呼叫。
#include <stdio.h>
int F(int n, int *c) {
if( n <= 2 ) return 1;
*c = 2; // count next two recursive calls
return F(n-1, c) F(n-2, c);
}
int main(void) {
int c, r;
for(int n=1; n<=10; n ) {
c = 0;
r = F(n, &c); // this call is not recursive!
printf("F(%d) = %d (calls = %d)\n", n, r, c);
}
}
輸出:
F(1) = 1 (calls = 0)
F(2) = 1 (calls = 0)
F(3) = 2 (calls = 2)
F(4) = 3 (calls = 4)
F(5) = 5 (calls = 8)
F(6) = 8 (calls = 14)
F(7) = 13 (calls = 24)
F(8) = 21 (calls = 40)
F(9) = 34 (calls = 66)
F(10) = 55 (calls = 108)
uj5u.com熱心網友回復:
如何計算 C 中斐波那契陣列的遞回呼叫次數?
使用 OP 的演算法,遞回呼叫計數也基于斐波那契數列。
對于x > 0:
number_of_recursive calls(x) = (FibonacciArray(x) - 1) * 2;
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/528342.html
標籤:C递归斐波那契函数定义
上一篇:這個問題有O(n^2)的方法嗎?
