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

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

     如果我问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。

    

   

时间: 2024-08-15 23:35:08

线性递归和迭代---分析阶乘的相关文章

线性递归和尾递归概述

今天一直在研究尾递归,看了些博文,记下点笔记,供以后复习用 线性递归:也即是普通递归,单向递归,线性递归函数的最后一步操作不是递归操作,而是其他的操作.当数据量很大的时候,会造成栈溢出,这是因为,在每次递归调用时,递归函数中的参数,局部变量等都要保存在栈中,如果数据量很大的话,便可能会溢出. 尾递归:也即是线性迭代,尾递归函数的最后一步操作是递归,也即在进行递归之前,把全部的操作先执行完,这样的好处是,不用花费大量的栈空间来保存上次递归中的参数.局部变量等,这是因为上次递归操作结束后,已经将之前

学DNS系列(十)图、例详解DNS递归和迭代查询原理及过程(1)

上节中提到了一些有关递归查询的内容,但说的很少,也很笼统,本节将会从原理和实例两方面入手分析DNS的递归以及迭代查询. 在此之前,我们需要了解一些背景知识,以便于更好的理解今天的主题内容. 在互联网中,一个域名的顺利解析离不开两类域名服务器,只有由这两类域名服务器可以提供"权威性"的域名解析. 第一类就是国际域名管理机构,也就InterNIC,主要负责国际域名的注册和解析,第二类就是国内域名注册管理机构,在中国就是CNNIC了,主要负责国内域名注册和解析,当然,尽管分为国际和国内,但两

【万字总结】探讨递归与迭代的区别与联系及如何求解10000的阶层

递归和迭代 这两个概念也许很多童鞋依旧分不清楚,下面通过求解斐波那契数来看看它们俩的关系吧. 斐波那契数的定义: f0=0 f1=1 fi=fi−1+fi−2(i>1) 递归: (factorial 6) (* 6 (factorial 5)) (* 6 (* 5 (factorial 4))) (* 6 (* 5 (* 4 (factorial 3)))) (* 6 (* 5 (* 4 (* 3 (factorial 2))))) (* 6 (* 5 (* 4 (* 3 (2 (factori

自备干货!如何有效的做产品迭代分析

自备干货!如何有效的做产品迭代分析 时间:2014-11-12 16:21 来源:网易uedc 作者:zhouxiaojue " 做过这么多产品迭代分析,却依然找不到 合适的方式表达." 产品迭代分析对于交互设计师可以说是家常便饭了,隔壁的某某有了新功能,某某家的谁又更新了个大版本,都需要时时保持关注. 但是,每当小珏吭哧吭哧的收集完一大堆资料后,又开始犯愁了:分析从何开始?分析的 重点是什么?分析以何种组织形式输出? 被这些问题蹂躏了数遍后,在求(xian)知(ma)欲(fan)的驱

递归与迭代

1.递归 当函数用自身来定义时就称为是递归(recursive)的. 递归必须满足四个基本法则: (1).基本情形:必须给出基准情况,不用递归就能求出,用于终止递归运算: (2).不断推进:对于那些要被递归求解的情形,递归调用必须能够朝着一个基准情形推进: (3).设计法则:假设所有的递归调用都能运行: (4).合成效益法则:在求解一个问题的同一个实例时,切勿在不同的递归调用中做重复性的工作. 2.迭代 迭代就是利用变量的原值推算出变量的一个新值. 若递归是自己调用自己的话,迭代就是自己不停的调

王亟亟的Python学习之路(六)-递归,迭代,列表生成式

转载请注明出处:王亟亟的大牛之路 最近事情比较多,也没什么时间学习.(借口,明明在偷懒) 难得空下来,就继续把文章写下去.(玩手游时间更多) 在贴今天要写的内容之前还是先说一下某些概念!(概念还是很重要的,虽然更重要的是理解) 什么是递归?(维基来的) 白话的理解就是某函数自己调用自己 大牛的分析: 递归的基本思想是把规模大的问题转化为规模小的相似的子问题来解决.在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况.另外这个解决问题的函数必须有明

C语言的递归思想实例分析_C 语言

本文实例分析C语言的递归思想,分享给大家供大家参考之用.具体方法如下: 通俗点来说,递归就是自己调用自己. 递归的难点一是理解递归的执行调用过程,二是设置一个合理的递归结束条件. 下面来看一段摘自书中的简单程序: #include <STDIO.H> long fact(int n); long rfact(int n); int main(void) { int num; printf("This program calculates factorials.\n"); p

Java中递归原理实例分析_java

本文实例分析了Java中递归原理.分享给大家供大家参考.具体分析如下: 解释:程序调用自身的编程技巧叫做递归. 程序调用自身的编程技巧称为递归( recursion).递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量.递归的能力在于用有限的语句来定义对象的无限集合.  递归的三个

php使用递归与迭代实现快速排序示例_python

复制代码 代码如下: /** * 递归法实现的快速排序 * @param $seq * @return array */function quicksort($seq){    if (count($seq) > 1) {        $k = $seq[0];        $x = array();        $y = array();        $_size = count($seq); //do not use count($seq) in loop for.        f