递归(以及几个关于递归的小样例)
2017-05-23 09:59
197 查看
在说递归之前,我给大家说一个小故事,故事就是在说递归之前,我给大家说一个小故事,故事就是在说递归之前。我给大家说一个小故事,故事就是在说递归之前,我给大家说一个小故事,故事就是在说递归之前我给大家说一个小故事......
这个故事的名字就叫做递归。。。哈哈。
故事尽管有点扯淡,但它却非常好的解释神马叫做递归。
递归的正式定义:
在数学和计算机科学中。递归指由一种(或多种)简单的基本情况定义的一类对象或方法,并规定其它全部情况都能被还原为其基本情况。
比如,下列为某人祖先的递归定义:
某人的双亲是他的祖先(基本情况)。
某人祖先的双亲相同是某人的祖先(递归步骤)
很多其它的定义请自行百度~~~,下面我说下我对于递归的体会:
1,递归说白了就是自己调用自己
2,能用其它方法解决的问题,就尽量不要使用递归(可能不对。仅仅是我的个人体会),耗用内存较大,尤其在 Java中尽量避免使用。
3,递归的调用是基于栈的
4,解决某个问题时,将其分割成n份。先运行1的操作。再进行n-1的操作,以此类推下去。
递归有几个经典的算法。这里给列出下面:
===============================切割线~~=============================================
案例1: 反转字符串
这里我用两种方式实现了。均採用递归方式。
1。源代码:
执行结果:
2,有一定局限性,须要结尾字符推断
执行结果:
==================================================================================
案例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起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。
执行结果:
================================================================================
案例3:汉诺塔问题
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。
大梵天创造世界的时候做了三根金刚石柱子。在一根柱子上从下往上依照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从以下開始按大小顺序又一次摆放在还有一根柱子上。
而且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次仅仅能移动一个圆盘。
执行结果:
================================切割线啦===================================
案例4:实现strlen
strlen()函数是C函数库中求字符串长度的函数,这里用递归实现它~
执行结果:
====================================================================================
案例5:全排列
在初中的时候。数学课上我们就学过了排列与组合。那啥叫全排列呢。比方abc 全排列的结果是: abc acb bac bca cab aba一共六种可能,解释完成~
执行结果:
以后想到了,会继续补上。
如有错误。望不吝指出。
这个故事的名字就叫做递归。。。哈哈。
故事尽管有点扯淡,但它却非常好的解释神马叫做递归。
递归的正式定义:
在数学和计算机科学中。递归指由一种(或多种)简单的基本情况定义的一类对象或方法,并规定其它全部情况都能被还原为其基本情况。
比如,下列为某人祖先的递归定义:
某人的双亲是他的祖先(基本情况)。
某人祖先的双亲相同是某人的祖先(递归步骤)
很多其它的定义请自行百度~~~,下面我说下我对于递归的体会:
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 = 0 n = 1 fibonacci = 1 n = 2 fibonacci = 1 n = 3 fibonacci = 2 n = 4 fibonacci = 3 n = 5 fibonacci = 5 n = 6 fibonacci = 8 n = 7 fibonacci = 13 n = 8 fibonacci = 21 n = 9 fibonacci = 34 n = 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 -> C A -> B C -> B A -> C B -> A B -> C A -> 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 : 0 The length of str2 is : -1 The 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; }
执行结果:
abcd abdc acbd acdb adcb adbc bacd badc bcad bcda bdca bdac cbad cbda cabd cadb cdab cdba dbca dbac dcba dcab dacb dabc 请按随意键继续. . .
以后想到了,会继续补上。
如有错误。望不吝指出。
相关文章推荐
- 递归(以及几个关于递归的小例子)
- 读写XML(1)-关于Dom4j 生成xml文件,以及格式化的xml文件的样例
- 关于递归的几个算法实现
- 关于奇偶校验的几个定义以及正确认识
- 关于结构体指针以及.和->区别的几个尝试
- 分治法对最大连续和以及归并排序,分治与递归实质把问题区间区域分割成几个小区间或者小分区,一直下钻到一个元素小区解决问题
- 关于Oracle中split函数的实现以及函数递归的举例。
- 关于SpringKafka消费者的几个监听器:[一次处理单条消息和一次处理一批消息]以及[自动提交offset和手动提交offset]
- SICP 关于递归迭代的重新理解以及尾递归的引入...
- 关于tomcat中虚拟主机的设置,以及为同一个网站添加几个域名的方法
- 3.关于python函数,以及作用域,递归等知识点
- 关于AdaBoost的讲义以及几个源码
- 关于几个iOS 7 API的功能分析:文本转语音、免费托管IAP以及3D地图等
- 关于无线网络中几个名词WPS,PSK,WPA,WPA2等名词的解释以及WPA的破解
- TCP状态以及关于内核调优的几个参数
- 关于字符串判断的几个常用属性 以及简单项目实现中数组运用的初步思想 蓝懿教育
- 关于几个统计值以及matlab的算法
- 关于File类的几个方法以及一些文件的操作
- 关于V4L2中操作比较重要的几个命令以及一般操作流程总结