递归
- 递归,就是在运行的过程中调用自己。
- 构成递归需具备的条件:
- 1. 子问题须与原始问题为同样的事,且更为简单;
- 2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。
递归 最大公约数与最小公倍数
#include<stdio.h>
int gcd(int a,int b){
return b==0? a:gcd(b,a%b);
}
int lcm(int a,int b){
return (a*b)/gcd(a,b);
}
int main(){
int a,b;
while(scanf("%d %d",&a,&b)!=EOF){
printf("%d\n",gcd(a,b));
printf("%d\n",lcm(a,b));
}
return 0;
}
递归 Fibonacci
#include<stdio.h>
int fibo(int a){
return a<=2?1:fibo(a-1)+fibo(a-2);
}
int main(){
int a;
while(scanf("%d",&a)!=EOF){
printf("%d\n",fibo(a));
}
return 0;
}
递归 Tower of Hanoi ( f(n)==2^n-1 )
#include<stdio.h>
int times;
int move(int n,char A,char B,char C){
long c1,c2;
if(n==1)
{
return 1;
}
else
{
c1=move(n-1,A,C,B);
c2=move(n-1,B,A,C);
return c1+c2+1;
}
}
void main(){
int a;
scanf("%d",×);
a=move(times,'a','b','c');
printf("%d个盘子需要移动%d次\n",times,a);
}
#include<stdio.h>
int h(int m)
{
int s;
if(m==1) // 确定初始条件
s=1;
else
s=2*h(m-1)+1;
return s;
}
int main()
{
int n;
scanf("%d",&n);
printf("%ld\n",h(n));
}
import java.util.Scanner;
public class Main {
public static void hanoi(int n, char A, char B, char C) {
if (n == 1) {
move(A, C);
} else {
hanoi(n - 1, A, C, B);//步骤1 按ACB数序执行N-1的汉诺塔移动
move(A, C); //步骤2 执行最大盘子移动
hanoi(n - 1, B, A, C);//步骤3 按BAC数序执行N-1的汉诺塔移动
}
}
private static void move(char A, char C) {//执行最大盘子的从A-C的移动
System.out.println("move:" + A + "--->" + C);
}
public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
int n = scanner.nextInt();
System.out.println("移动汉诺塔的步骤:");
hanoi(n, 'a', 'b', 'c');
}
}