递归及其应用 ( 阶乘 ,Fibonacci 数列,整数划分问题)

一、递归:

         “ 大懒支小懒 ”

1 . 递归函数 : 用函数自身给出定义的函数。(通俗来讲,即 自己玩自己)

2 . 两个要素边界条件 递归方程

3 . 递归算法:直接或间接调用自身的算法。

4 . 优点:算法简明、正确性易证明;

5 . 缺点:执行效率不高 、堆栈空间耗费;

    总之,递归是分析、设计的有力工具。


6 . 具体实例:

(1) . 阶乘问题:
         计算 n!

递归思想:将规模为 n 的大问题转化为规模为 n-1 的一个小问题进行求解。

#include <iostream>

using namespace std;

long int n;
long int result;

int multi(int n)
{
   if(n==0) return 1;          //是递归的边界条件

   else return n*multi(n-1);    //当 n>0时,n!=n(n-1)!,是该递归的递归方程

}
int main()
{
    cin >> n;

    result=multi(n);
    cout << result;

    return 0;
}

(2) . 斐波那契数列 Fibonacci:
         无穷数列 1,1,2,3,5,8,13,21,34,55,. . . . . . .(后一项的值是前两项数值之和)

递归思想:将规模为 n 的大问题转化为规模为 ( n-1 )和(n-2) 的两个小问题进行求解。

#include <iostream>

using namespace std;

int n;

int Fibonacci(int n)
{
   if( n==1 || n==2)  return 1;      //边界条件
   else return Fibonacci(n-1)+Fibonacci(n-2);     //是相应的递归方程
}
int main()
{
    cin >> n;
    cout << Fibonacci(n);

    return 0;
}

(3) . 整数划分问题:
      将正整数表示成一系列正整数之和,这种表示称为一个划分。
      求正整数 n 的不同的划分个数。

例如:正整数n = 6有如下11种不同的划分:

6      5+1    4+1+1    3+1+1+1    2+1+1+1+1    1+1+1+1+1+1
                  4+2        3+2+1        2+2+1+1
                                3+3            2+2+2

因此,我们可以考虑增加一个变量,加数不大于m 的划分个数记为 q (n , m )

整数划分问题详解

#include <iostream>

using namespace std;

int n;
int m;

int spilt(int n,int m)
{
   if( n==1 || m==1)  return 1;
   if( m==n ) return 1+spilt(n,m-1);
   if( n>m )  return spilt(n-m,m)+spilt(n,m-1);
   if( n<m ) return spilt(n,n);
}
int main()
{
    cin >> n;
    cout << spilt(n,n);

    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值