Stories

Detail Return Return

關於一種計算遞歸次數題的思路 - Stories Detail

代碼如下
要求計算最後輸出的count的結果

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int count = 0;
int fib(int a)
{
	count++;
	if (a == 0)
		return 1;
	else if (a == 1)
		return 2;
	else
		return fib(a - 1) + fib(a - 2);
}
int main()
{
	fib(10);
	printf("%d", count);
}

當遇到此類檢索遞歸調用次數的題目,我們可以以由簡到繁的思路來解決

我們看到,上面的例題直接進行計算是很複雜的,如果從輸入的數字10開始解決,一步一步按順序羅列,最終要計算的數字幾乎是天文的(不過也沒那麼誇張,真硬算也能算)

此時對於這類遞歸,我們可以倒着來,從簡單的數入手

我們可以先計算fib(0),此時顯然,主函數的打印結果為1,因為count++;語句只被執行了一次

我們再來計算fib(1),同樣count++;語句只被執行了一次

再看fib(2),當輸入的值為2,我們執行else後的語句fib(1) + fib(0),神奇的事情發生了,我們發現計算fib(2)的結果正好是fib(1)fib(0)的結果之和再加上1(這裏1是首次進入函數時count++的值,也就是執行fib(2)的這次)

那麼計算方式就很明確了,我們只需要依次計算下去,很容易就能得到fib(10)輸出的count的值

比如fib(3)的count的值就等於fib(2)fib(1)的count值再加一,fib(4)的count的值等於fib(3)的count的值加fib(2)的count的值再加1,以此類推,最後得到結果為177

Add a new Comments

Some HTML is okay.