递归(以及几个关于递归的小例子)

来源:互联网 发布:域名交易网站有哪些 编辑:程序博客网 时间:2024/05/16 09:41

        在说递归之前,我给大家说一个小故事,故事就是在说递归之前,我给大家说一个小故事,故事就是在说递归之前,我给大家说一个小故事,故事就是在说递归之前,我给大家说一个小故事,故事就是在说递归之前我给大家说一个小故事......

      这个故事的名字就叫做递归。。。哈哈。

故事虽然有点扯淡,但它却很好的解释神马叫做递归。

递归的正式定义:

       在数学和计算机科学中,递归指由一种(或多种)简单的基本情况定义的一类对象或方法,并规定其他所有情况都能被还原为其基本情况。
例如,下列为某人祖先的递归定义:
某人的双亲是他的祖先(基本情况)。
某人祖先的双亲同样是某人的祖先(递归步骤)

更多的定义请自行百度~~~,以下我说下我对于递归的体会:

1,递归说白了就是自己调用自己

2,能用其他方法解决的问题,就尽量不要使用递归(可能不正确,只是我的个人体会),耗用内存较大,尤其在          Java中尽量避免使用。

3,递归的调用是基于栈的

4,解决某个问题时,将其切割成n份,先执行1的操作,再进行n-1的操作,以此类推下去。



递归有几个经典的算法,这里给列出以下:

===============================分割线~~=============================================

案例1: 反转字符串

这里我用两种方式实现了,均采用递归方式。

   1,源码:

  

// 递归.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <stdlib.h>void reverse_str(char * str){if((NULL != str) &&(*str != '\0')){reverse_str(str + 1);printf("%c",*str);}}int _tmain(int argc, _TCHAR* argv[]){reverse_str("woshi ni erdaye");printf("\n");system("pause");return 0;}

运行结果:

eyadre in ihsow请按任意键继续. . .


  2,有一定局限性,需要结尾字符判断

 

// 递归.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <stdlib.h>void reverse_str_2(){char ch;ch = getchar();if (ch != '.')//以.结束{reverse_str_2();}printf("%c",ch);}int _tmain(int argc, _TCHAR* argv[]){reverse_str_2();printf("\n");system("pause");return 0;}

运行结果:

haha gaga xixi..ixix agag ahah请按任意键继续. . .

==================================================================================

案例2:Fibonacci数列

斐波那契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F1=,F2=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。

#include "stdafx.h"#include <stdlib.h>int fibonacci(int n){if(n==0){return 0;}if(n == 1){return 1;}if(n > 0){return fibonacci(n-1) + fibonacci(n-2);}}int main(){int n = 10;for ( int i=0; i<=n; i++){int val = fibonacci(i);printf("n = %d\t fibonacci = %d\n",i,val);}system("pause");return 0;}

运行结果:

n = 0    fibonacci = 0n = 1    fibonacci = 1n = 2    fibonacci = 1n = 3    fibonacci = 2n = 4    fibonacci = 3n = 5    fibonacci = 5n = 6    fibonacci = 8n = 7    fibonacci = 13n = 8    fibonacci = 21n = 9    fibonacci = 34n = 10   fibonacci = 55请按任意键继续. . .

================================================================================

案例3:汉诺塔问题
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。


#include "stdafx.h"#include <stdlib.h>void hannuo(int n,char a,char b,char c){if(n == 1){printf("%c -> %c \n",a,c);}if(n>1){hannuo(n-1,a,c,b);printf("%c -> %c \n",a,c);hannuo(n-1,b,a,c);}}int main(){hannuo(3,'A','B','C');system("pause");return 0;}


运行结果:

A -> CA -> BC -> BA -> CB -> AB -> CA -> C请按任意键继续. . .


================================分割线啦===================================

案例4:实现strlen

strlen()函数是C函数库中求字符串长度的函数,这里用递归实现它~

#include "stdafx.h"#include <stdlib.h>int strlen(const char * str){if (str == NULL){return -1;}else if (*str == '\0'){return 0;}else{return strlen(str + 1) + 1;}}int main(void){char * str1 = "";printf("The length of str1 is : %d\n",strlen(str1));char * str2 = NULL;printf("The length of str2 is : %d\n",strlen(str2));char * str3 = "wo shi yi ge zi fu chuan lalala~";printf("The length of str3 is : %d\n",strlen(str3));system("pause");return 0;}

运行结果:

The length of str1 is : 0The length of str2 is : -1The length of str3 is : 32请按任意键继续. . .

====================================================================================

案例5:全排列

在初中的时候,数学课上我们就学过了排列与组合。那啥叫全排列呢,比如abc 全排列的结果是: abc acb bac bca cab aba一共六种可能,解释完毕~


#include "stdafx.h"#include <stdlib.h>void quanpailie(char *s ,int b,int e){if((b>=0) && (b<=e)){if(b == e){printf("%s\n",s);}else {int i;for(i=b; i<=e; i++)            {                char c = s[b];                s[b] = s[i];                s[i] = c;                                quanpailie(s, b+1, e);                                c = s[b];                s[b] = s[i];                s[i] = c;            }}}}int main(){    char s[] = "abcd";        quanpailie(s, 0, 3);    system("pause");    return 0;}

运行结果:

abcdabdcacbdacdbadcbadbcbacdbadcbcadbcdabdcabdaccbadcbdacabdcadbcdabcdbadbcadbacdcbadcabdacbdabc请按任意键继续. . .



以后想到了,会继续补上。


如有错误,望不吝指出





1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 脸上痒发红发肿怎么办 孩子作业拖拉爱丢三落四怎么办 腿肌肉按摩肿了怎么办 孩子上一年级成绩差怎么办 小孩脖子拧筋了怎么办 小孩塑料玩具拧不出来怎么办 一年级孩子做数学题粗心怎么办 手和脚有点肿怎么办 手破了之后肿了怎么办 手指肿了有脓怎么办 宝宝手指红肿有脓怎么办 孩子一听做作业就烦气怎么办 虎皮鹦鹉脚瘸了怎么办 虎皮鹦鹉脚受伤了怎么办 虎皮鹦鹉脚流血了怎么办 虎皮鹦鹉被风扇打到脚怎么办 虎皮鹦鹉脚脱臼了怎么办 孩子作业做得慢怎么办 员工给公司造成损失怎么办 小孩有写不完的作业家长怎么办 一年级孩子作业太粗心怎么办 孩子最近不好好做作业怎么办 工作压力大害怕做不好怎么办 孩子的数算不对怎么办? 孩子计算老是出错怎么办呢 孩子经常计算错误能怎么办 孩子老出现计算错误怎么办 孩子做作业马虎该怎么办 黑笔写错了纸破了怎么办 幼儿园报名写错怎么办名字 中考写错了字怎么办 头发没干想睡觉怎么办 突然天旋地转恶心想吐怎么办 突然天旋地转的浑身出汗怎么办 3岁半不认识数字怎么办 孩子长倒睫毛该怎么办 一年级的孩子口算慢怎么办? 大班社会领域怎么办教学反思 表带活动圈坏了怎么办 手表固针h掉了怎么办 cad图全部倒过来了怎么办