4.4_递归函数
- 格式:pptx
- 大小:651.17 KB
- 文档页数:23


递归的工作原理
递归是一种通过调用自身来解决问题的方法。
它通过将一个大问题分解为较小的、同类的子问题来进行求解。
递归的工作原理可以概括为以下几个步骤:
1. 定义基准情况:递归函数首先需要定义一个基准情况,即最简单的情况,该情况下可以直接给出结果,而不是再次调用自身。
基准情况通常是在满足某个条件时返回固定值或特定操作。
2. 分解问题:递归函数会将给定的问题分解为更小的同类子问题。
这个过程可以通过递归调用本身来实现。
每次递归调用时,问题的规模都会减小,同时保持相同的问题类型。
3. 调用递归函数:递归函数在解决子问题时通过调用自身来实现。
通过递归调用,问题将会在不断分解和缩小的过程中得到解决。
4. 组合结果:递归函数返回的结果会被用来组合成大问题的解。
递归函数返回的结果通常会在每一层递归结束后进行合并、计算或其他操作。
5. 终止递归:为了防止递归无限循环,递归函数需要在某个条件下终止递归调用。
这个条件通常和基准情况或问题规模相关,当满足条件时,递归将停止执行。
需要注意的是,递归函数的设计需要保证每次递归调用后问题规模都会减小,否则递归可能会陷入无限循环,导致程序运行
出错或引起栈溢出。
此外,递归可能会造成重复计算,因此可以采用记忆化搜索等方法进行优化。
离散数学作为数学的一个分支,研究的是离散的数学结构和离散的数学对象。
在离散数学中,递归函数和生成函数是两个重要的概念。
递归函数是离散数学中常用的一种定义函数的方法,而生成函数则是离散数学中描述数列的一种方法。
首先,我们来了解一下递归函数。
递归函数是一种在定义中使用了函数自身的函数。
它在数学和计算机科学中都有广泛的应用。
在离散数学中,递归函数可以用来定义数列和组合数等对象。
一个典型的递归函数定义形式是:f(n)=g(n, f(n-1), f(n-2), ...)。
其中,g是一个表达式,描述了函数f在不同输入下的计算规则。
递归函数的定义可以帮助我们理解问题的本质,并能够用简洁的方式描述复杂的数学对象。
例如,斐波那契数列就可以通过递归函数进行定义。
斐波那契数列的定义是:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2) (n>1)。
通过递归函数,我们可以很容易地计算出任意位置的斐波那契数值。
而生成函数是另一种在离散数学中常用的方法,用来描述数列的方法。
生成函数是一个形如F(x)=a0+a1x+a2x^2+...的函数,其中ai表示数列中第i项的系数。
生成函数的主要作用是将数列转化为一个多项式函数,从而使得数列的求和、乘法和递推等操作可以通过多项式函数的运算来实现。
生成函数的优势在于它提供了一种统一的框架,能够将不同的数列问题转化为多项式的运算。
例如,如果我们要求斐波那契数列的每一项的和,我们可以通过斐波那契数列的生成函数F(x)=1/(1-x-x^2)来实现。
我们只需要将生成函数展开为多项式,再对多项式进行求和操作,就可以得到斐波那契数列的和。
递归函数和生成函数在离散数学中的应用非常广泛。
它们能够描述很多复杂的数学结构和问题,并能够通过一些简单的规则进行计算。
递归函数和生成函数的使用可以大大简化数学问题的求解过程,提高计算效率。
总结起来,离散数学中的递归函数和生成函数是两个非常重要的概念。
python——递归函数递归函数1. 递归函数的定义:函数直接或间接的调⽤函数本⾝,则称该函数为递归函数。
也就是说,如果在⼀个函数内部,调⽤⾃⾝本⾝,那么这个函数就称为递归函数。
2. 计算阶乘的算法就⽤到了递归函数,func(n)= n * func(n-1)1#定义函数2 >>> def func(n):3if n==1:4return 15return n*func(n-1)67#调⽤函数8 >>> func(1)9 110 >>> func(5)11 12012 >>> func(100)13 9332621544394415268169923885626670049071596826438162146859296389521759999322991560894146397615651828625369792082722375825118521091686400000000000000000003. 递归函数的优点是逻辑简单清晰,缺点是过深的递归容易导致栈溢出4. 尾递归:为了解决递归调⽤栈溢出的问题。
尾递归是指,在函数返回的时候,调⽤⾃⾝,并且 return 语句中不能包含表达式。
尾递归和循环的效果⼀样,可以把循环看成⼀种特殊的尾递归函数。
⽤尾递归实现阶乘算法:1 >>> def func(n):2return func_iter(n,1)34 >>> def func_iter(num,product):5if num==1:6return product7return func_iter(num-1,num*product)尾递归调⽤时,如果做了优化,栈不会增长,因此,⽆论多少次调⽤也不会导致栈溢出。
遗憾的是,⼤多数编程语⾔没有针对尾递归做优化,Python解释器也没有做优化,所以,即使把上⾯的 func(n)函数改成尾递归⽅式,也会导致栈溢出5.汉诺塔问题:1 >>> def move(n,a,b,c): #n为圆盘数,a代表初始位圆柱,b代表过渡位圆柱,c代表⽬标位圆柱2if n==1:3print(a,'-->',c)4else:5#将初始位的n-1个圆盘移动到过渡位,此时初始位为a,上⼀级函数的过渡位b即为本级的⽬标位,上级的⽬标位c为本级的过渡位6 move(n-1,a,c,b)7print(a,'-->',c)8#将过渡位的n-1个圆盘移动到⽬标位,此时初始位为b,上⼀级函数的⽬标位c即为本级的⽬标位,上级的初始位a为本级的过渡位9 move(n-1,b,a,c)101112 >>> move(3,'A','B','C')13 A --> C14 A --> B15 C --> B16 A --> C17 B --> A18 B --> C19 A --> C。
递归函数流程js递归函数是一种在编程中常用的技巧,它可以通过调用自身来解决问题。
在JavaScript中,递归函数的流程可以分为三个步骤:基本情况、递归调用和返回结果。
首先,我们需要定义递归函数的基本情况。
基本情况是指在问题规模较小或特殊情况下的处理方式。
在递归函数中,我们通常会使用if语句来判断是否满足基本情况。
如果满足基本情况,递归函数会直接返回结果。
否则,递归函数会进入下一步骤,即递归调用。
递归调用是指在递归函数中调用自身。
通过递归调用,我们可以将原始问题分解为更小的子问题,并通过不断调用自身来解决这些子问题。
在递归调用时,我们通常会改变问题的规模或参数,以便逐步接近基本情况。
递归调用会一直进行,直到满足基本情况为止。
最后,递归函数会返回结果。
在递归调用结束后,递归函数会将最终的结果返回给调用者。
这个结果可以是一个具体的值,也可以是一个数据结构或对象。
通过返回结果,递归函数完成了整个问题的求解过程。
下面是一个简单的例子来说明递归函数的流程。
假设我们要计算一个正整数的阶乘。
我们可以使用递归函数来解决这个问题。
```javascriptfunction factorial(n) {// 基本情况if (n === 0 || n === 1) {return 1;}// 递归调用return n * factorial(n - 1);}// 调用递归函数console.log(factorial(5)); // 输出 120```在这个例子中,递归函数`factorial`用于计算一个正整数的阶乘。
首先,我们判断是否满足基本情况,即`n`等于0或1。
如果满足基本情况,递归函数会直接返回1。
否则,递归函数会调用自身,并将问题的规模减小1。
最后,递归函数会将最终的结果返回给调用者。
通过以上的例子,我们可以看到递归函数的流程。
首先是基本情况,然后是递归调用,最后是返回结果。
递归函数的流程可以帮助我们理解递归的原理,并在编程中灵活运用。