理解遞迴的想法不難,關鍵是如何 快速 寫出 正確 高效 的遞迴。
函式遞迴呼叫的基本形式:
type myfunction()
下面以遞迴實現 快速冪 ,說明一下寫遞迴的一些注意點,這些要點是不是必要的我不知道,我想這需要嚴格的證明。
一般求冪的方法是呼叫中的pow()函式,例如求
如果要造輪子的話,一種想法是用for迴圈:
#include #include using namespace std;
int forpower(int x, int n)
return y;
}int main()
當然,forpower(2,6) = 2 * 2 * 2 * 2 * 2 * 2,執行了五次乘法。即forpower(x, n)的時間複雜度大約是o(n)。可不可以更快呢?
比如對於
#include #include using namespace std;
long long power(int x, int n) elseelse }}
int main()
對於power(2,7),圖示描述其運算流程:
因此,個人的看法是,要寫好遞迴,三個東西很重要:
1.向內層的遞迴y = power(x, n/2);
2.向外層的返回return n % 2 == 0 ? y * y : y * y * x;
3.邊界層的返回return x;
其實很像數學歸納法。
個人淺見,歡迎批評指正!
演算法提高快速冪(快速冪演算法詳解)
問題描述 給定a,b,p,求 a b mod p。輸入格式 輸入共一行。第一行有三個數,n,m,p。輸出格式 輸出共一行,表示所求。樣例輸入 2 5 3 樣例輸出 資料規模和約定 共10組資料 對100 的資料,a,b為long long範圍內的非負整數,p為int內的非負整數。所謂的快速冪,實際上...
演算法提高 快速冪
快速冪講解 問題描述 給定a,b,p,求 a b mod p。輸入格式 輸入共一行。第一行有三個數,n,m,p。輸出格式 輸出共一行,表示所求。樣例輸入 2 5 3 樣例輸出 2資料規模和約定 共10組資料 對100 的資料,a,b為long long範圍內的非負整數,p為int內的非負整數。inc...
演算法提高 快速冪
演算法提高 快速冪 時間限制 1.0s 記憶體限制 256.0mb 問題描述 給定a,b,p,求 a b mod p。輸入格式 輸入共一行。第一行有三個數,n,m,p。輸出格式 輸出共一行,表示所求。樣例輸入 2 5 3 樣例輸出 2 資料規模和約定 共10組資料 對100 的資料,a,b為long...