您的位置:首页 > 其它

求正整数n的分解式——通过题目来了解和加深递归思想

2011-10-21 20:12 483 查看
刚开始,我们学习递归思想的时候可能都会以求N的阶乘为例子。这是一个很简单的递归例子,可以很直白地展现递归的思想。可是我们对递归的理解往往会限于这种简单的模式中,很难跳出来。当我们遇到稍微难点的问题,我们可能又无从下手了。我深有感触。下面是一个比较好的例子,做出后,对递归的了解会更加深刻。

题目:对于给定的正整数n,编程计算n共有多少种不同的分解式。

Example:12=2*2*3=2*3*2=2*6=3*4=…

解题代码:

#include<stdio.h>

#include<stdlib.h>

//判断n是否为质数, 如果是质数则表示不可再分解,否则可以继续分解

bool zhishu(int n)

{

for(int i = 2; i <= n/2; i++)

{

if(0 == n % i)return false;

}

return true;

}

//分解函数,递归实现

//求整数N的分解式个数num可以这么理解:

//分成两部分,一部分是for(int i = 2; i <= n/2; i++)if(0==n%i)num++;

//另一部分为,当(n%i==0)时, nx = n/i; for(int j = 2; j < nx/2; j++)if(0==nx%j)num++;

//Example:n = 12时

//n0 = 12 -> 12/2=6; 12/3=4; 12/4=3; 12/6=2;

//n1 = 6 -> 6/2=3;

//n2 = 4 -> 4/2=2;

//n3 = 6 -> 6/2=3;

//共有7种情况

int parts(int n, int m)

{

int t = 2; //保证每个递归子式都能够从2开始检测

if(zhishu(n))return 0;

if(m <= n/2 && n%m == 0)return 1 + parts(n/m, t) + parts(n, m+1);

if(0 != n%m && m <= n/2)return parts(n,m+1);

return 0;

}

int main()

{

int n;

printf("请输入正整数n:");

scanf("%d", &n);

int num = 0;

int m = 2;

num = parts(n,m);

printf("%d的分解式个数为%d: ", n, num);

system("pause");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐