线性递归和迭代---分析阶乘

简介: 为了帮助更多编程者入门,我决定通过计算机程序解释与构造这本书上的例子来引出几个例子,帮助别人同时,也等于给自己复习,我们来看一个简单的例子----阶乘      如果我问5的阶乘是多少,那么根据公式可以推倒出:5!=5*4*3*2*1 = 120      这个算法其实很简单,实现如下:      n! = n * (n -1) * (n - 2) ... * 3 * 2 * 1 ;      仔细观察,不难发现一个通项公式: n * (n -1)  。

为了帮助更多编程者入门,我决定通过计算机程序解释与构造这本书上的例子来引出几个例子,帮助别人同时,也等于给自己复习,我们来看一个简单的例子----阶乘

     如果我问5的阶乘是多少,那么根据公式可以推倒出:5!=5*4*3*2*1 = 120

     这个算法其实很简单,实现如下:

     n! = n * (n -1) * (n - 2) ... * 3 * 2 * 1 ;

     仔细观察,不难发现一个通项公式: n * (n -1)  。

     于是,我们就很快可以照葫芦画瓢写出以下程序:   

#include <stdio.h>

int digui(int num)
{
	if(num == 0)
		return 1 ; 
	if(num < 0)
		return -1 ;
	return num*digui(num-1) ;
}

/*
5!
5*4*3*2*1
5*(5-1)*(5-2)*(5-3)*(5-4)
*/
int main(void)
{
	int num = 0;
	int ret ;
	scanf("%d",&num);
	ret = digui(num) ;
	printf("%d\n",ret);
	return 0 ;
}
由分析可以得出,当num传参进digui()这个函数的时候,首先进行数据的校验,如果值等于1或者等于0时,直接返回1。

        然后继续看,如果num = 5 ;阶乘满足下面的递归关系(如果n ≥ 1)接下来计算机程序会被这么切:

       digui(5)  ---->  5 * digui(5 -1) = 20 ,此时num的值发生了改变,由5变成了4。

       digui(4)  ---->  5 * 4 * digui(4 -1) = 60 ,此时num的值发生了改变,由4变成了3。

       digui(3)  ---->  5 * 4 * 3 * digui(3 -1) = 120 ,此时num的值发生了改变,由3变成了2。

       digui(2)  ---->  5 * 4 * 3 * 2 *digui(2 -1) = 120 ,此时num的值发生了改变,由2变成了1。

       所以,最终的结果就是120。

    

   

目录
相关文章
|
1月前
|
机器学习/深度学习 算法
递归算法题练习(数的计算、带备忘录的递归、计算函数值)
递归算法题练习(数的计算、带备忘录的递归、计算函数值)
|
2月前
|
算法 C语言
求解亲密数代码剖析
求解亲密数代码剖析
|
10月前
|
算法
斐波那契数列(递归+迭代)
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、3
91 0
算法学习--递归斐波那契数
算法学习--递归斐波那契数
算法学习--递归求n的阶乘
算法学习--递归求n的阶乘
|
算法
详解时间复杂度计算公式(附例题细致讲解过程)
详解时间复杂度计算公式(附例题细致讲解过程)
585 0
详解时间复杂度计算公式(附例题细致讲解过程)
|
算法
算法 | 两种方式实现斐波那契数
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”
127 0
算法 | 两种方式实现斐波那契数
|
算法 Java 程序员
巧用递归解决矩阵最大序列和问题
巧用递归解决矩阵最大序列和问题

热门文章

最新文章