递归操作
1. 递归介绍
2. 操作示例
- 汉诺塔问题
- FJ的字符串
递归介绍
递归算法
一种直接或者间接调用自身的算法
递归算法的实质
把问题看成由一个个相同或者类似的小规模问题所构成的,然后递归调用解决问题
递归解决问题的特点:
1,调用自身
2,有一个明显的递归结束出口,这个很重要
3,使用递归代码会很简洁,但是会消耗大量的时间,运行效率不高
4,递归的本质就是一个栈,遵循着先进后出的原则
汉诺塔问题
题目介绍:
一块板上有三根针 A、B、C。A 针上套有 64 个大小不等的圆盘,按照大的在下、小的在上的顺序排列,要把这 64 个圆盘
从 A 针移动到 C 针上,每次只能移动一个圆盘,移动过程可以借助 B 针。但在任何时候,任何针上的圆盘都必须保持大盘在下,
小盘在上。从键盘输入需移动的圆盘个数,给出移动的过程。
题目分析:
对于汉诺塔问题,当只移动一个圆盘时,直接将圆盘从 A 针移动到 C 针。若移动的圆盘为 n(n>1),则分成几步走:
把 (n-1) 个圆盘从 A 针移动到 B 针(借助 C 针);
A 针上的最后一个圆盘移动到 C 针;
B 针上的 (n-1) 个圆盘移动到 C 针(借助 A 针)。
每做一遍,移动的圆盘少一个,逐次递减,最后当 n 为 1 时,完成整个移动过程。
代码展示:
#include <stdio.h>
#include <string.h>
/*
1,将 n-1个盘子先放到B座位上
2,将A座上地剩下的一个盘移动到C盘上
3,将n-1个盘从B座移动到C座上
*/
void move(char x,char y)
{
printf("%c--->%c",x,y)
}
void hannuo(int n,char A ,char B,char C)
{
if(n==1)
move(A, C);
else
{
hannuo(n-1,A,C,B);
move(A,C);
hannuo(n-1,B,A,C);
}
}
void main()
{
int n;
printf("input your number");
scanf("%d",&n);
hannuo(n,'A','B','C');
return 0;
}
FJ的字符串
题目介绍:
问题描述
FJ在沙盘上写了这样一些字符串:
A1 = “A”
A2 = “ABA”
A3 = “ABACABA”
A4 = “ABACABADABACABA”
… …
你能找出其中的规律并写所有的数列AN吗?
输入格式
仅有一个数:N ≤ 26。
输出格式
请输出相应的字符串AN,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。
样例输入
3
样例输出
ABACABA
题目分析:
这道题是典型的递归问题,就相似度来说和汉诺塔有的一拼
FJ的字符串:
1,找出输出字符串的特点,建立函数调用模型
2,找到递归调用的出口
3,注意细节,写出代码
代码展示(已验证):
// 蓝桥杯 c语言
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void print(int n)
{
if (n == 0)
printf("%c", 'A');
else
{
print(n - 1); // 先输出 最早出现的字母
printf("%c",n+'A'); // ASCII 码值 以字符形式输出 最新的字符在中间
print(n - 1); // 后面输出的也是 最早的字母
}
}
int main(int argc, char *argv[])
{
int N;
scanf("%d", &N);
print(N-1); // 调用函数
printf("\n");
return 0;
}
泡泡:
确实,递归在一些问题的解决上是比较方便的,但是会越来越发现递归的使用不那么多,好多一些递归解决的问题都已经使用 栈 来解决了,
也就是非递归的使用会变得越来越多。但是递归的思想很棒,值得学习。