递归的概念:函数递归过程

定义

直接或间接地调用自身的算法称为递归算法。用函数自身给出定义的函数称为递归函数。使用递归技术往往会使代码更简洁,使算法的描述更清晰且容易理解。

举例

例 1:阶乘函数
阶乘函数递归的定义为:
n!= \begin{cases} 1& n=0 \\ n(n-1)! &n>0 \end{cases}
当n=0时,n!=1,这是这个函数的初始条件,是非递归定义的,是此递归函数的退出条件。这个递归函数在执行时,会不断的调用自身,寻找自身的值减一后的阶乘值,直到自身值减一为0时,此时函数递归到了最后一层(即非递归定义的退出条件),这时n=0的阶乘为1,然后层层回滚,计算出n=1的阶乘的值后,再去计算n=2时阶乘的值,这样一直不断的计算n+1阶乘的值,直到回滚到初始的n的阶乘的值。

每一个递归函数都要有非递归定义的初始值,不然无法退出函数调用的循环。

代码如下:

#include<iostream>
using namespace std;
int sum = 0;   //定义全局变量sum,用于记录函数调用自身的次数
//使用 long long 类型的返回值,防止n的阶乘的值过大,超出了int型的范围
long long fac(int n)
{
   sum++;
   if (n == 0 )
       return 1;
   else
       return n * fac(n - 1);
}
int main()
{
    int n;
    cin >> n;
    cout << n << "的阶乘为:" << fac(n) << endl;
    cout << "函数调用的次数为:" << sum;
    return 0;
}

运行结果:
n=8时的运行结果
结果分析:
最开始传值的时候即n=8时进入函数,sum自增后为1。此后,进入else分支,进行递归,再次进入函数时n=7。依此类推,最后一次进入函数时n=0,而n=0恰好是此递归函数的初始条件,自此不再调用自身。故此可以看出初始条件是递归函数所必需的要有的,不然无法退出循环。当n=8,7,6,5,4,3,2,1,0时都进入过函数,故sum累加值为9。

例 2:斐波那契数列
无穷数列 1, 1, 2, 3, 5 ,…称为斐波那契数列,它具有前两项之和等于后一项的特点。它可以递归的定义为:

F(n)= \begin{cases} 1 &n=0 \\ 1 &n=1 \\F(n-1)+F(n-2) &n>1\end{cases}

代码如下:

#include<iostream>
using namespace std;
int sum = 0;   //记录函数调用的次数
int Fibonacci(int n)
{
   sum++;
   if(n == 0)
       return 1;
   if(n == 1)
       return 1;
   if(n > 1)
       return Fibonacci(n - 1) + Fibonacci(n - 2);
}
int main()
{
   int n;
   cin >> n;
   cout << "斐波那契数列的第" << n <<"项为:" << Fibonacci(n) <<endl;
   cout << "函数调用的次数为:" << sum;
   return 0;
}

运行结果:
在这里插入图片描述
结果分析:
n=3时进入函数一次(sum=1),执行递归项为Fibonacci(1)和Fibonacci(2)。执行Fibonacci(1)时(sum=2),直接返回结果1,不再递归。而执行Fibonacci(2)时(此时sum=3),执行递归项Fibonacci(1)和Fibonacci(0),执行完后sum=3+2=5。故共调用函数5次。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值