递归和分治——整数划分问题

q(n,m)表示最大加数不大于m的划分个数。

(1)q(n,1)=1,n>=1

(2)q(n,m)=q(n,n),m>=n

(3)q(n,n)=q(n,n-1)+1。正整数n的划分有n1=n的划分和n1<=n-1的划分组成

(4)q(n,m)=q(n,m-1)+q(n-m,m),n>m>1。正整数n的最大加数n1不大于m的划分由n1=m的划分和n1<=m-1的划分组成。

其中正整数的划分=q(n,n)

递归:

#include <iostream>
#include <cstdio>
#include <stack>
#include <cstdlib>
using namespace std;
int divide(int n,int m)
{
    if(n<1||m<1)
        return 0;
    if(n==1||m==1)
        return 1;
    if(n<m)
        return divide(n,n);
    if(n==m)
        return divide(n,n-1)+1;
    return divide(n,m-1)+divide(n-m,m);
}
int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        printf("%d\n",divide(n,m));
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是用分治法实现计算 x 的整数 n 次幂函数的 C 语言代码: ```c double myPow(double x, int n) { if (n == 0) return 1; // 当 n 等于 0 时,返回 1 if (n < 0) return 1 / myPow(x, -n); // 当 n 小于 0 时,先将 n 取相反数,再计算结果的倒数 double half = myPow(x, n/2); // 归计算 x 的 n/2 次幂 if (n % 2 == 0) return half * half; // 当 n 为偶数时,返回 half 的平方 else return half * half * x; // 当 n 为奇数时,返回 half 的平方再乘以 x } ``` 该函数首先判断 n 是否等于 0,如果是,则直接返回 1。如果 n 小于 0,则先将 n 取相反数,再计算结果的倒数。接着,函数归计算 x 的 n/2 次幂,然后根据 n 的奇偶性来计算 x 的 n 次幂。当 n 为偶数时,返回 half 的平方;当 n 为奇数时,返回 half 的平方再乘以 x。这样,归计算的时间复杂度为 O(log n)。 例如,对于输入 x = 2,n = 10,该函数的计算过程如下: - 第一次归:myPow(2, 5) - 第二次归:myPow(2, 2) - 第三次归:myPow(2, 1) - 第四次归:myPow(2, 0) 在第四次归中,n 等于 0,直接返回 1。接着,将结果返回到第三次归,计算 2 的 1 次幂,返回 2。将结果返回到第二次归,计算 2 的 2 次幂,即 2 * 2,返回 4。最后,将结果返回到第一次归,计算 2 的 5 次幂,即 4 * 4 * 2,返回 32。因此,最终结果为 32。 ### 回答2: C语言实现pow(x, n)的代码如下: ```c double pow(double x, int n) { if (n == 0) { return 1; // x的0次方等于1 } else if (n < 0) { return 1 / pow(x, -n); // 将负数指数转换为正数进行计算 } else if (n % 2 == 0) { double temp = pow(x, n / 2); return temp * temp; // 若指数是偶数,则归计算x的n/2次方并平方 } else { return x * pow(x, n - 1); // 若指数是奇数,则归计算x的n-1次方,并再乘以x } } ``` 代码解析如下: 首先判断指数n的情况: 1. 若n为0,直接返回1,因为任何数的0次方都等于1。 2. 若n小于0,将负数指数转换为正数进行计算,即返回1除以pow(x, -n)的结果,这是利用x的倒数进行计算。 3. 若n为偶数,归计算pow(x, n/2)的结果,并将结果平方。这是一个分治的过程,将n划分为两个n/2的问题,并将结果进行相乘。 4. 若n为奇数,归计算pow(x, n-1)的结果,并将结果乘以x。这也是一个分治的过程,将n划分为一个n-1的问题,并将结果乘以x。 通过以上归和分治的方法,可以实现计算x的整数n次方的功能。这种算法的时间复杂度为O(log n),效率较高。 ### 回答3: 下面是用C语言实现 pow(x, n) 的代码,采用分治法实现: ```c double myPow(double x, int n) { if(n == 0) { // 当n为0时,任何数的0次幂都等于1 return 1.0; } if(n < 0) { // 当n为负数时,可将问题转化为求倒数的正数次幂 return 1 / myPow(x, -n); } if(n % 2 == 0) { // 当n为偶数时,将问题转化为之前结果的平方 double temp = myPow(x, n / 2); return temp * temp; } else { // 当n为奇数时,将问题转化为平方后再乘以底数x double temp = myPow(x, (n - 1) / 2); return x * temp * temp; } } ``` 代码中的分治法通过将问题分解为更小规模的子问题来解决。每个子问题都是求x的一半幂次,并根据n的奇偶性进行不同的计算。 当n为0时,任何数的0次幂都等于1,因此直接返回1.0即可。 当n为负数时,可将问题转化为求倒数的正数次幂。这里通过将n取相反数来得到正数次幂的结果,然后取倒数即可。 当n为正数且为偶数时,将问题转化为之前结果的平方。具体实现中,先归求得x的n/2次幂,然后将结果平方即可。 当n为正数且为奇数时,将问题转化为平方后再乘以底数x。具体实现中,先归求得x的(n-1)/2次幂,然后将结果平方,并乘以底数x。 最后,根据n的正负性和奇偶性分别进行计算,最终得到x的n次幂的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值