递归
递归(英语:Recursion),又译为递回,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。递归一词还较常用于描述以自相似方法重复事物的过程。例如,当两面镜子相互之间近似平行时,镜中嵌套的图像是以无限递归的形式出现的。也可以理解为自我复制的过程。
例子:
汉诺塔
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
汉诺塔实现
递归实现
递归实现思路:
- 先将前 n-1 个盘子移动到Y上,确保大盘在小盘下。
- 再将最底下的第 n 个盘子移动到Z上。
- 最后将Y上的 n-1 个盘子移动到Z上。
/******************************************
* 函数名称:hanoi(int n,char x,char y,char z)
* 功能描述:汉诺塔问题递归实现
* 传入参数:int n 汉诺塔的层数
* char x 地一根柱子
* char y 中间的柱子
* char z 最右边柱子
* 返回值:无
* 汉诺塔:汉诺塔:汉诺塔(又称河内塔)问题是源于
* 印度一个古老传说的益智玩具。大梵天创造
* 世界的时候做了三根金刚石柱子,在一根柱
* 子上从下往上按照大小顺序摞着64片黄金圆
* 盘。大梵天命令婆罗门把圆盘从下面开始按
* 大小顺序重新摆放在另一根柱子上。并且规
* 定,在小圆盘上不能放大圆盘,在三根柱子
* 之间一次只能移动一个圆盘。
* -|- | |
* --|-- | |
* ---|--- | |
* =================================
******************************************/
int hanoi(int n,char x,char y,char z)
{
if(1 == n)
{
printf("从%c--->%c\n",x,z);
}
else
{
hanoi(n-1,x,z,y);
printf("从%c--->%c\n",x,z);
hanoi(n-1,y,x,z);
}
return 0;
}
斐波那契数列(Fibonacci)
斐波那契数列(意大利语:Successione di Fibonacci),又译为菲波拿契数列、菲波那西数列、斐氏数列、黄金分割数列。
在数学上,斐波那契数列是以递归的方法来定义公式如下:
用文字来说,就是斐波那契数列由0和1开始,之后的斐波那契数就是由之前的两数相加而得出。首几个斐波那契数是:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233……
根据高德纳(Donald Ervin Knuth)的《计算机程序设计艺术》(The Art of Computer Programming),1150年印度数学家Gopala和金月在研究箱子包装对象长宽刚好为1和2的可行方法数目时,首先描述这个数列。在西方,最先研究这个数列的人是比萨的列奥那多(意大利人斐波那契Leonardo Fibonacci),他描述兔子生长的数目时用上了这数列。
假设兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。第一个月我们有一对小兔子,如果所有兔子都不死,那么每个月的兔子对数,就符合斐波那契数列。
需要满足的条件如下:
- 第一个月初有一对刚诞生的兔子
- 第二个月之后(第三个月初)它们可以生育
- 每月每对可生育的兔子会诞生下一对新兔子
- 兔子永不死去
斐波那契数列实现
迭代实现
/****************************************
* 函数名称:
* 功能描述:迭代实现斐波那契数列
* 传入参数:int size 数列长度
* 返回值:无
****************************************/
void Fibonacci_1(int size)
{
int i = 2;
int a[size];
a[0] = a[1] = 1;
printf("%d ",a[0]);
printf("%d ",a[1]);/*前两个为1*/
if(i >= 2)
{
for(i =2 ;i <= size; i++)
{
a[i] = a[i-1]+a[i-2];
printf("%d ",a[i]);
if(i % 10 == 0)
{
printf("\n");
}
}
}
}
递归实现
/*****************************************
* 函数名称:Fibonacci_2(int size)
* 功能描述:递归实现斐波那契数列
* 传入参数:int size 数列长度
* 返回值:斐波那契数列值
* 斐波那契数列:0 1 1 2 3 5 8 13 21 34
******************************************/
int Fibonacci_2(int size)
{
if(size < 2)
{
return size == 0 ? 0 : 1;
}
return Fibonacci_2(size - 1) + Fibonacci_2(size - 2);
}
/********************************************
* 函数名称:Fib(int size)
* 功能描述:打印斐波那契数列
* 传入参数:斐波那契数列长度
* 返回值:0
********************************************/
int Fib(int size)
{
int i;
for(i = 0; i < size; i++)
{
printf("%d ",Fibonacci_2(i));
}
return 0;
}
🙃
(ง •_•)ง
(。・∀・)ノ
🎈