問題描述:編寫遞歸函數(shù),求一個(gè)大于2的正整數(shù)n的素因子之和
輸入:一個(gè)大于2的正整數(shù)n
輸出:這個(gè)數(shù)的所有素因子之和
實(shí)例
輸入:4,16,30
輸出:2,2,10
解題思路:
(1)題目限制用遞歸函數(shù)求解鹅搪,便要了解遞歸函數(shù)的要訣:遞歸終止條件和遞歸過程痒谴;
(2)遞歸終止條件顧名思義妻怎,滿足該條件遞歸函數(shù)返回到調(diào)用其的主調(diào)函數(shù)(有“遞”就有“歸”);
搞清楚這兩點(diǎn)后希柿,再思考本題要遞什么哭尝,歸什么斥杜。顯然涕俗,是要遞輸入的正整數(shù)(可能不完全,我的解答過程也表明只遞該正整數(shù)也不行)椎眯,歸這個(gè)正整數(shù)的素因子之和挠将。搞清楚這兩件事之后,開始尋找遞歸終止條件盅视。
由于我在求素因子用的是蠻力求法(從2往后試)捐名,所以判斷遞歸終止條件是( n == i )。但此時(shí)有兩種情況會(huì)發(fā)生闹击,一是當(dāng)前求得的素因子和之前不等镶蹋,另一種情況是相等,因而要分開寫返回語(yǔ)句赏半,前者返回當(dāng)前i的值贺归;后者返回0。開始解答本問題時(shí)断箫,我沒有意識(shí)到這一點(diǎn)拂酣,導(dǎo)致無法得到正確的解法。
解決了遞歸終止條件問題后仲义,就要寫遞歸過程了婶熬。也分為兩種情況剑勾,我是在設(shè)置了一個(gè)求和函數(shù)又撤銷的反復(fù)過程中才理解清楚這個(gè)遞歸過程(也許現(xiàn)在可能還有紕漏吧)。一種是當(dāng)前i值是其素因子和非素因子赵颅。當(dāng)然獲得一個(gè)素因子之后還要判斷是否等于之前的素因子虽另,等于則要去掉,于是我設(shè)置了一個(gè)全局變量保存了上一步求得的素因子饺谬。通過前后兩個(gè)素因子的比較才解決了這個(gè)問題捂刺。
完整代碼如下:
/*問題:編寫遞歸函數(shù),求一個(gè)大于2的正整數(shù)的質(zhì)因數(shù)之和
Written by : Jimmy Tung
Date : 2020.03.10-03.13
*/
//程序功能:
// 輸入:大于2的正整數(shù)n
// 輸出: n < 3 輸出錯(cuò)誤
// n 合適 輸出正整數(shù)n的質(zhì)因數(shù)之和
// n 過大 (先不考慮此類情況,如輸入一個(gè)100位的整數(shù))
#include <stdio.h>
#include <stdlib.h>
int Recur_Prim( int, int); //遞歸求解質(zhì)因子
int main(void)
{
int num; //存放輸入的正整數(shù)
printf("請(qǐng)輸入一個(gè)大于2的正整數(shù):");
while( scanf("%d", &num)!= 1 || num < 3)
{
while(getchar() != '\n') //確保讀取到符合條件的正整數(shù)
;
printf("輸入錯(cuò)誤,請(qǐng)重新輸入:");
}
printf("%d的質(zhì)因子之和為:%d", num, Recur_Prim( num, 2));
system("PAUSE");
return 0;
}
//遞歸求解質(zhì)因子之和
int prim_pre = 0; //定義一個(gè)全局變量保存此前求得的質(zhì)因子,目的是為了篩掉重復(fù)的素因子
int Recur_Prim(int n, int i)
{
if( i == n && i == prim_pre) return 0; //遞歸終止條件1
else if( i == n && i != prim_pre) return i; //遞歸終止條件2
//遞歸過程
if( i != n && n%i == 0 )
{
n = n/i;
if( prim_pre == i )
{
return Recur_Prim( n, i);
}
else
{
prim_pre = i;
return i + Recur_Prim( n, i);
}
}
else
{
return Recur_Prim( n, ++i);
}
}
我自忖資質(zhì)淺薄,關(guān)于這個(gè)問題思考了大概三天時(shí)間才想清楚募寨。與我而言族展,難點(diǎn)主要在于理解遞歸終止條件上面。說來有趣的很拔鹰,這個(gè)問題我是在去同學(xué)家的路上想通的仪缸,當(dāng)時(shí)只想著去朋友那里玩兩天,但題目未得破解的郁悶仍在心頭格郁,在車上無聊腹殿,便冥想起來独悴,左思右想居然想通了例书!天意啊刻炒!