什么是递归程序

什么是递归程序,第1张

很简单,自己调用自己,我们最常说的:

从前有座山,山里有座庙,庙里有个老和尚,有一天,老和尚给小和尚故事:

从前有座山,山里有座庙,庙里有个老和尚,有一天,老和尚给小和尚故事:

从前有座山,山里有座庙,庙里有个老和·····················

这就是一个标准的递归

注意:必须要有结束的条件,这个例子就是没有结束条件,成死循环了·····

可以加个,计数的,比如:n++,如果n==10,break或者return。

望采纳!全手打!

递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。

一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数)。

递归过程一般通过函数或子过程来实现。递归方法:在函数或子过程的内部,直接或者间接地调用自己的算法。

特点

递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。

递归算法解决问题的特点:

(1) 递归就是在过程或函数里调用自身。

(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。

(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。

要求

递归算法所体现的“重复”一般有三个要求:

一是每次调用在规模上都有所缩小(通常是减半);

二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入);

三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。

参考:

 病毒木马恶意程序入侵导致的故障有很多恶

递归,通俗地说,就是在程序中自己调用自己。最典型的例子就是计算整数的阶乘。

一般来说,编写递归程序时,必须要有终止条件,否则的话就会形成无限制递归下去,形成死循环。计算 n! C 语言程序如下:

#include <stdioh>

void main( )

{

int n = 0 , result = 0 ;

scanf("%d", &n ) ;

result = my_digui(n) ;

printf(" n ! = %d\n", result ) ;

}

my_digui( int n )

{

if( n == 1) / 递归程序终止条件:1 的阶乘等于 1。若 n 等于 1,返回 1 /

return( 1 ) ;

else / n 不等于 1,返回 n my_digui(n-1)。因为:n ! = n (n-1) ! /

return ( n my_digui(n-1) ) ;

}

你的问题得你自己解决,我给你个思路

首先,递归如果在函数中,我们叫它递归函数

比如: f(x)=f(x-1)+f(x-2) 这是 fibonacici数

第二 递归一定有边界!!,请牢记这条,没边界就死循环了

比如 f(0)=1; f(1)=1;

如果你看的递归程序 不是用函数写的,那不要紧,关键还得找

递归变量,比如每次递归都会给当前状态 增加状态值或状态转移,

比如: value=value-1;

if (value==0) { break; }

看递归程序 只看两个

1 状态转移方程 或 状态转移表 或者 简单的状态转移函数

2 边界条件,退出条件(即 当什么时候 程序退出 或 递归终止)

中间递归过程 我们(从来)是不考虑的, 因为递归是树状的,这个楼主应该知道吧,所以分支太多 考虑不完的。

以上内容原创,

递归算法(英语:recursion algorithm)在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。

递归式方法可以被用于解决很多的计算机科学问题,因此它是计算机科学中十分重要的一个概念。绝大多数编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归。

计算理论可以证明递归的作用可以完全取代循环,因此在很多函数编程语言(如Scheme)中习惯用递归来实现循环。

递归程序

在支持自调用的编程语言中,递归可以通过简单的函数调用来完成,如计算阶乘的程序在数学上可以定义为:

这一程序在Scheme语言中可以写作:

(define (factorial n)  (if (= n 0)      1      ( n (factorial (- n 1)))))

不动点组合子

即使一个编程语言不支持自调用,如果在这语言中函数是第一类对象(即可以在运行期创建并作为变量处理),递归可以通过不动点组合子(英语:Fixed-point combinator)来产生。以下Scheme程序没有用到自调用,但是利用了一个叫做Z 算子(英语:Z combinator)的不动点组合子,因此同样能达到递归的目的。

(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程序同样计算一个数字的阶乘,但是使用尾部递归:

(define (factorial n)  (define (iter product counter)    (if (> counter n)        product        (iter ( counter product)              (+ counter 1))))  (iter 1 1))

能够解决的问题

数据的定义是按递归定义的。如Fibonacci函数。

问题解法按递归算法实现。如Hanoi问题。

数据的结构形式是按递归定义的。如二叉树、广义表等。

参考资料

百科-递归算法百度百科[引用时间2018-4-2]

以上就是关于什么是递归程序全部的内容,包括:什么是递归程序、递归算法 怎么判断递归体和递归头、怎么样去理解递归函数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9282908.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存