c语言 简单递归操作

递归操作

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;
}

泡泡:

确实,递归在一些问题的解决上是比较方便的,但是会越来越发现递归的使用不那么多,好多一些递归解决的问题都已经使用 栈 来解决了,
也就是非递归的使用会变得越来越多。但是递归的思想很棒,值得学习。

猜你喜欢

转载自blog.csdn.net/qq_42124842/article/details/92086014