%cn", 什么是递归?递归有什么用?" />

您现在的位置是:影视综艺

什么是递归?递归有什么用?,什么是递归算法

2020-10-19 23:27影视综艺

简介递归算法就是一个函数通过不断对自己的调用而求得最终结果的一种思维巧妙但是开销的算法。比如:汉诺塔的递归算法:void move(char x,char y){ printf("%c-->%cn", 什么是递归?递归有什么用?...

递归算法就是一个函数通过不断对自己的调用而求得最终结果的一种思维巧妙但是开销的算法。

比如:

汉诺塔的递归算法:

void move(char x,char y){

printf("%c-->%c\n",x,y);

}

void hanoi(int n,char one,char two,char three){

/*将n个盘从one座借助two座,移到three座*/

if(n==1) move(one,three);

else{

hanoi(n-1,one,three,two);

move(one,three);

hanoi(n-1,two,one,three);

}

}

main(){

int n;

printf("input the number of diskes:");

scanf("%d",&n);

printf("The step to moving %3d diskes:\n",n);

hanoi(n,'A','B','C');

}

我说下递归的理解方法

首先:对于递归这一类函数,你不要纠结于他是干什么的,只要知道他的一个模糊功能是什么就行,等于把他想象成一个能实现某项功能的黑盒子,而不去管它的内部操作先,好,我们来看下汉诺塔是怎么样解决的

首先按我上面说的把递归函数想象成某个功能的黑盒子,void hanoi(int n,char one,char two,char three); 这个递归函数的功能是:能将n个由小到大放置的小长方形从one 位置,经过two位置 移动到three位置。那么你的主程序要解决的问题是要将m个的"汉诺块"由A借助B移动到C,根据我们上面说的汉诺塔的功能,我相信傻子也知道在主函数中写道:hanoi(m,A,B,C)就能实现将m个块由A借助B码放到C,对吧?所以,mian函数里面有hanoi(m,'A','C','B');这个调用。

接下来我们看看要实现hannoi的这个功能,hannoi函数应该干些什么?

在hannoi函数里有这么三行

hanoi(n-1,one,three,two);

move(one,three);

hanoi(n-1,two,one,three);

同样以黑盒子的思想看待他,要想把n个块由A经过B搬到C去,是不是可以分为上面三步呢?

这三部是:第一步将除了最后最长的那一块以外的n-1块由one位置经由three搬到two 也就是从A由C搬到B 然后把最下面最长那一块用move函数把他从A直接搬到C 完事后 第三步再次将刚刚的n-1块借助hannoi函数的功能从B由A搬回到C 这样的三步实习了n块由A经过B到C这样一个功能,同样你不用纠结于hanoi函数到底如何实现这个功能的,只要知道他有这么一个神奇的功能就行

最后:递归都有收尾的时候对吧,收尾就是当只有一块的时候汉诺塔怎么个玩法呢?很简单吧,直接把那一块有Amove到C我们就完成了,所以hanoni这个函数最后还要加上 if(n==1)move(one,three);(当只有一块时,直接有Amove到C位置就行)这么一个条件就能实现hanoin函数n>=1时将n个块由A经由B搬到C的完整功能了。

递归这个复杂的思想就是这样简单解决的,呵呵 不知道你看懂没?纯手打,希望能帮你理解递归

总结起来就是不要管递归的具体实现细节步骤,只要知道他的功能是什么,然后利用他自己的功能通过调用他自己去解决自己的功能(好绕口啊,日)最后加上一个极限情况的条件即可,比如上面说的1个的情况。

大连理工大学某某童鞋

-

下面是更多关于递归算法的问答

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

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

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

特点

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

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

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

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

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

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

要求

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

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

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

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

参考:http://baike.baidu.com/view/1733593.htm去百度文库,查看完整内容>

内容来自用户:nhz312

如果一个对象部分地由自己组成,或者是按它自已定义的,则称为是递归的。递归不仅在中会遇到,在日常生活中也可以遇到。请看下面的图片:

直接或间接地调用自身的算法称为递归算法。

用函数自身给出定义的函数称为递归函数。

在计算机算法设计与分析中,递归技术是十分有用的。使用递归技术往往使函数的定义的算法的描述简洁且易于理解。有些数据结构如二叉树等,由于其本身固有的递归特性,特别适合用递归的形式来描述。另外,还有一些问题,虽然其本身并没有明显的递归结构,但用递归技术来求解使设计出的算法简洁易懂且易于分析。

递归算法一般用于解决三类问题:

(1)数据的定义形式是按递归定义的。这类递归问题往往又可转化成递推算法,递归边界作为递推的边界条件。

比如阶乘的定义:

                        (式2-1)

又如裴波那契(Fibonacci)数列的定义:

                   (式2-2)

(2)问题解法按递归算法实现。例如回溯等。

(3)数据的结构形式是按递归定义的。如树的遍历,图的搜索等。

递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。

1、程序调身的编程技巧称归。递为一种算法在程序设言泛应用。 一个过程或函数定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

2、递归一般的作用用于解决三类问题:

(1)数据的定义是按递归定义的。(Fibonacci函数)

(2)问题解法按递归算法实现。

这类问题虽则本身没有明显的递归结构,但用递归求解比迭代求解更简单,如Hanoi问题。

(3)数据的结构形式是按递归定义的。 本回答被网友采纳

递归算法(英语: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]

Java递归算基于Java语言实现的递归算法。递归算法是一种直接或者间接调用自身函数或者方法的算法。递归算法实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法表示问题的解。递归往往能给我们带来非常简洁非常直观的代码形式,从而使我们的编码大大简化,然而递归的思维确实跟我们的常规思维相逆的,通常都是从上而下的思维问题,而递归趋势从下往上的进行思维。

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

【1】递归就是方法里调用自身。

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

【3】递归算法代码显得很简洁,但递归算法解题的运行效率较低。所以不提倡用递归设计程序。

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

【5】在做递归算法的时候,一定把握出口,也就是做递归算法必须要有一个明确的递归结束条件。这一点是非常重要的。其实这个出口就是一个条件,当满足了这个条件的时候我们就不再递归了。

三、代码示例:

代码执行流程图如下:

此程序中n=5就是程序的出口。

Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。

本回答被网友采纳 我感觉较接近思维的方,用于些光用循环解较复杂的问

例1.阶乘(较有特点的了)

计算x!

一般循环就是

int multi = 1;

if (x <=1) return (1);

for(int i=1;i<=x;i++)

multi = multi*i;

return(multi);

递归把x!看作x*(x-1)!

int multi(int x)

{

if(x==0||x==1) return 1;

else return x*multi(x-1);

}

这样就能把x!算出来

例2 最著名的就是汉诺塔了

你可以网上找点资料看看

Tags:递归算法,什么是递归算法,什么是递归?递归有什么用?