• 振兴中华--递归


    描述
    ×××参加了学校的趣味运动会,其中的一个项目是:跳格子。
    地上画着一些格子,每个格子里写一个字,如下所示:(也可参见下图)
    从我做起振
    我做起振兴
    做起振兴中
    起振兴中华
    比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。
    要求跳过的路线刚好构成“从我做起振兴中华”这句话。
    请你帮助×××算一算他一共有多少种可能的跳跃路线呢?
    输出
    可能的总量n
    递归解法
    
    import java.util.*;
    public class problem {
    	public int count = 0;
    	public void f(int x, int y) {// 格子要么横 ,要么竖 两种情况 递归写两种横着一个 竖着一个
    		if (x == 1 && y == 1) {
    			count++;
    		} else {
    			if (x == 1) {// 到最边的时候只能有一种走法
    				count++;
    			} else if (y == 1) {// 到最边的时候只能有一种走法
    				count++;
    			} else {
    				f(x - 1, y);// 竖
    				f(x, y - 1);// 横
    			}
    		}
    	}
    	public static void main(String[] args) {
    		problem p = new problem();
    		p.f(5, 4);
    		System.out.println(p.count);
    	}
    }
    
    参考网上的视频 https://www.bilibili.com/video/av36899189/?p=5
    上面也可以用深度遍历来解
    还有非递归的方法 如下 用二维数组保存到每一个格有几种方法,每一个格都是它上面和它左边的数值相加
    
    import java.util.*;
    public class problem {
    	public int f(int x, int y) {// 格子要么横 ,要么竖 两种情况 递归写两种横着一个 竖着一个
    		int[][] arr = new int[x][y];
    		for (int i = 0; i < x; i++) {
    			arr[i][0] = 1;
    		}
    		for (int i = 0; i < y; i++) {
    			arr[0][i] = 1;
    		}
    		for (int i1 = 1; i1 < x; i1++) {
    			for (int i2 = 1; i2 < y; i2++) {
    				arr[i1][i2] = arr[i1 - 1][i2] + arr[i1][i2 - 1];
    			}
    		}
    		return arr[x - 1][y - 1];
    	}
    	public static void main(String[] args) {
    		problem p = new problem();
    		System.out.println(p.f(5, 4));
    	}
    }
    
  • 相关阅读:
    手机号 验证(正则)
    静态库相关
    添加友盟SDK,实现新浪分享和微信朋友圈分享的关键代码
    删除Mac 系统中多出得MobileBackups 文件夹
    浏览器判断检测手机中是否安装了ios/android客户端程序
    浏览器判断是否安装了ios/android客户端程序
    自定义TextField的删除按钮
    应用崩溃日志解析
    关于UITextView的一些问题
    关于UIColor这个类的一些不知道的事
  • 原文地址:https://www.cnblogs.com/cznczai/p/11148178.html
Copyright © 2020-2023  润新知