×

递归函数的使用方法

递归函数的使用方法(c语言中递归函数的运行过程)

admin admin 发表于2023-08-25 06:39:32 浏览39 评论0

抢沙发发表评论

本文目录

c语言中递归函数的运行过程

递归(recursion)就是子程序(或函数)直接调用自己或通过一系列调用语句间接调用自己,是一种描述问题和解决问题的基本方法。 递归通常用来解决结构自相似的问题。所谓结构自相似,是指构成原问题的子问题与原问题在结构上相似,可以用类似的方法解决。具体地,整个问题的解决,可以分为两部分:第一部分是一些特殊情况,有直接的解法;第二部分与原问题相似,但比原问题的规模小。实际上,递归是把一个不能或不好解决的大问题转化为一个或几个小问题,再把这些小问题进一步分解成更小的问题,直至每个小问题都可以直接解决。因此,递归有两个基本要素: (1)边界条件:确定递归到何时终止,也称为递归出口。 (2)递归模式:大问题是如何分解为小问题的,也称为递归体。递归函数只有具备了这两个要素,才能在有限次计算后得出结果汉诺塔问题:对汉诺塔问题的求解,可以通过以下3个步骤实现: (1)将塔上的n-1个碟子借助塔C先移到塔B上; (2)把塔A上剩下的一个碟子移到塔C上; (3)将n-1个碟子从塔B借助塔A移到塔C上。 在递归函数中,调用函数和被调用函数是同一个函数,需要注意的是递归函数的调用层次,如果把调用递归函数的主函数称为第0层,进入函数后,首次递归调用自身称为第1层调用;从第i层递归调用自身称为第i+1层。反之,退出第i+1层调用应该返回第i层。采用图示方法描述递归函数的运行轨迹,从中可较直观地了解到各调用层次及其执行情况,具体方法如下: (1)写出函数当前调用层执行的各语句,并用有向弧表示语句的执行次序; (2)对函数的每个递归调用,写出对应的函数调用,从调用处画一条有向弧指向被调用函数入口,表示调用路线,从被调用函数末尾处画一条有向弧指向调用语句的下面,表示返回路线; (3)在返回路线上标出本层调用所得的函数值。n=3时汉诺塔算法的运行轨迹如下图所示,有向弧上的数字表示递归调用和返回的执行顺序三、递归函数的内部执行过程 一个递归函数的调用过程类似于多个函数的嵌套的调用,只不过调用函数和被调用函数是同一个函数。为了保证递归函数的正确执行,系统需设立一个工作栈。具体地说,递归调用的内部执行过程如下: (1)运动开始时,首先为递归调用建立一个工作栈,其结构包括值参、局部变量和返回地址; (2)每次执行递归调用之前,把递归函数的值参和局部变量的当前值以及调用后的返回地址压栈; (3)每次递归调用结束后,将栈顶元素出栈,使相应的值参和局部变量恢复为调用前的值,然后转向返回地址指定的位置继续执行。 上述汉诺塔算法执行过程中,工作栈的变化如下图所示,其中栈元素的结构为(返回地址,n值,A值,B值,C值),返回地址对应算法中语句的行号,分图的序号对应图中递归调用和返回的序号我可以帮助你,你先设置我最佳答案后,我百度Hii教你。

怎么用递归函数算阶乘

代码如下:

vim test.sh

#!/bin/bash

read -p “Num:“ num   #read 函数读取手动输入一个数值

result=1              #首先定义一个变量值为1

for i in `seq $num`   #i在num 中从小到大依次取值

do

 result=$

done

echo “The result is: $result“

扩展资料

递归函数的作用和循环的方法效果一样,即递归函数本质上是一个方法的循环调用,注意:有可能会出现死循环。因此,使用递归函数时,一定要定义递归的边界(即什么时候退出循环)。

来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出:

fact(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = fact(n-1) x n

所以,fact(n)可以表示为n x fact(n-1),只有n=1时需要特殊处理。

于是,fact(n)用递归的方式写出来就是:

def fact(n):

if n==1:        return 1

return n * fact(n - 1)

参考资料来源:

百度百科——递归函数

递归主方法

递归的主要方法是什么?一、递归算法 递归算法(英语:recursion algorithm)在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。递归式方法可以被用于解决很多的计算机科学问题,因此它是计算机科学中十分重要的一个概念。绝大多数编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归。计算理论可以证明递归的作用可以完全取代循环,因此在很多函数编程语言(如Scheme)中习惯用递归来实现循环。二、递归程序在支持自调的编程语言中,递归可以通过简单的函数调用来完成,如计算阶乘的程序在数学上可以定义为:这一程序在Scheme语言中可以写作:1(define (factorial n) (if (= n 0) 1 (* n (factorial (- n 1)))))不动点组合子即使一个编程语言不支持自调用,如果在这语言中函数是第一类对象(即可以在运行期创建并作为变量处理),递归可以通过不动点组合子(英语:Fixed-point combinator)来产生。以下Scheme程序没有用到自调用,但是利用了一个叫做Z 算子(英语:Z combinator)的不动点组合子,因此同样能达到递归的目的。1(define Z (lambda (f) ((lambda (recur) (f (lambda arg (apply (recur recur) arg)))) (lambda (recur) (f (lambda arg (apply (recur recur) arg)))))))(define fact (Z (lambda (f) (lambda (n) (if (《= n 0) 1 (* n (f (- n 1))))))))这一程序思路是,既然在这里函数不能调用其自身,我们可以用 Z 组合子应用(application)这个函数后得到的函数再应用需计算的参数。尾部递归尾部递归是指递归函数在调用自身后直接传回其值,而不对其再加运算。尾部递归与循环是等价的,而且在一些语言(如Scheme中)可以被优化为循环指令。 因此,在这些语言中尾部递归不会占用调用堆栈空间。以下Scheme程序同样计算一个数字的阶乘,但是使用尾部递归: 1(define (factorial n) (define (iter product counter) (if (》 counter n) product (iter (* counter product) (+ counter 1)))) (iter 1 1))三、能够解决的问题数据的定义是按递归定义的。如Fibonacci函数。问题解法按递归算法实现。如Hanoi问题。数据的结构形式是按递归定义的。如二叉树、广义表等。 四、递归数据数据类型可以通过递归来进行定义,比如一个简单的递归定义为自然数的定义:“一个自然数或等于0,或等于另一个自然数加上1”。Haskell中可以定义链表为:1data ListOfStrings = EmptyList | Cons String ListOfStrings这一定义相当于宣告“一个链表或是空串列,或是一个链表之前加上一个字符串”。可以看出所有链表都可以通过这一递归定义来达到。

递归函数是如何执行的 使用递归函数与使用循环、数组有什么不同

递归函数,是指在一个函数中,重复多次调用自身的一种函数。他可以用循环来实现,不过比较麻烦。但是递归函数比较容易理解,最常见的就是汉诺塔问题的解析(这个具体找别的资料看看哈。) 递归函数的主要用处,就是在于重复多次的调用自身。例如:你在吃饭的时候,要进行拿筷子夹饭, 送入口中,咀嚼,吞下等4个动作。假设,把这四个动作当做一个函数,然后在函数的最后判断,一下,吃饱了没有。在没有吃饱的情况下,就继续吃饭。吃饭(){ 夹饭(); 入口(); 咀嚼(); 吞下(); if 没饱 吃饭(); else 饱了 不吃了();} 那吃饭就是一个递归函数了。

c语言怎么用递归调用函数的方法求n的阶乘

1、打开VC6.0软件,新建一个C语言的项目:

2、接下来编写主程序,首先定义用来求阶乘的递归函数以及主函数。在main函数里定义变量sum求和,调用递归函数fact(),并将返回值赋予sum,最后使用printf打印sum的结果,主程序就编写完了:

3、最后运行程序,观察输出的结果。以上就是C语言使用递归求阶乘的写法: