一、什么是递归?
程序调用自身的编程技巧称为递归( recursion)。
递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接
调用自身的
一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,
递归策略
只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
递归的主要思考方式在于:把大事化小
二、递归的两个必要条件
1.存在限制条件,当满足这个限制条件的时候,递归便不再继续。
2.每次递归调用之后越来越接近这个限制条件。
三、实践练习
1.斐波那契数列的定义就是典型的递归问题,在n小于等于二的时候为1,大于二是前两个数字相加,重复着相加过程,又有初始元素这一极限,较为典型的用递归来求第n个元素的设计如下:
int fib(int n) {
if (n <= 2)
return 1;
else
return fib(n - 1) + fib(n - 2);
}
2、青蛙跳台问题
题目内容及解题思路分析:
可能如果直接带入第一步并没有递归的传递的思想,在第n(n>2)的时候,要么从第n-1层上来,要么从第n-2层上来,所以第n层的跳法就是第n-1层和n-2层的跳法的累加,所以,按照这个思路,我们可以得到:
#include<stdio.h>
int qingwa(int n)
{
if (n == 1)
{
return 1;
}
else if (n == 2)
{
return 2;
}
else
{
return qingwa(n - 1) + qingwa(n - 2);
}
}
int main()
{
int n = 0;
scanf("%d", & n);
int f = 0;
f = qingwa(n);
printf("%d", f);
return 0;
}
3.汉诺塔问题
相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置n个金盘。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
一个圆盘可以直接移动到c,两个可以先把上面一个移动到b,底下移动到c,b柱移动到c.
1个圆盘:a->c
2个圆盘:a->b a->c b->c
3个圆盘:a->c a->b c->b a->c b->a b->c a-c
代码如下,增加了计数器,统计次数
#define _CRT_SECURE_NO_WARNINGS 1
#include< string.h >
#include <stdio.h>
void move(char a, char c)//实现移动
{
printf("%c->%c ",a, c);//会接收到不同的参数a和c
}
//n代表盘子的总数,pos1为起始位置,pos2为中转位置,pos3为目的位置
int count = 0;
void Hanoi(int n, char a, char b, char c)
{
//如果只有一个盘子,就直接将这个盘子从A挪到C
if (n == 1)
{
move(a, c);
count++;
}
else
{
Hanoi(n - 1, a, c, b);//将一个盘子从A借助C挪到B
move(a, c);//将最下面的盘子从A挪到C
count++;
Hanoi(n - 1,b, a, c);//将n-1个盘子从B借助A挪到C
}
}
int main()
{
int n = 0;//n是要挪的盘子总数
scanf("%d", &n);
Hanoi(n, 'A', 'B', 'C');//A,B,C相当于三个柱子
printf("移动了%d次", count);
return 0;
}