1. 程式人生 > 其它 >Java機試題:請計算n*m的棋盤格子,從棋盤左上角出發沿著邊緣線從左上角走到右下角,總共有多少種走法。【動態規劃(遞推、遞迴、迭代)】

Java機試題:請計算n*m的棋盤格子,從棋盤左上角出發沿著邊緣線從左上角走到右下角,總共有多少種走法。【動態規劃(遞推、遞迴、迭代)】

描述

請計算n*m的棋盤格子(n為橫向的格子數,m為豎向的格子數)從棋盤左上角出發沿著邊緣線從左上角走到右下角,總共有多少種走法,要求不能走回頭路,即:只能往右和往下走,不能往左和往上走。 注:沿棋盤格之間的邊緣線行走

思路

參考連結:https://www.nowcoder.com/questionTerminal/e2a22f0305eb4f2f9846e7d644dba09b 用遞迴來做,將右下角看做原點(0, 0),左上角看做座標(m, n): 從(m, n)—>(0, 0)就分兩步走: 往右走一步:f(m, n - 1)—>(0, 0) 加上下走一步:f(m - 1, n)—>(0, 0)則有遞迴式: f(m, n) = f(m, n - 1) + f(m - 1, n)
但凡是觸碰到邊界,也就是說f(x, 0)或者f(0,x)都只有一條直路可走了,則結束迴圈條件如下: m == 0 || n == 0 , return 1;
import java.util.*;


public class Main {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextLine()){
           String[] nums =  sc.nextLine().split(" ");
           
int n = Integer.valueOf(nums[0]); int m = Integer.valueOf(nums[1]); int sum = getNums(n,m); System.out.println(sum) ; } }
// 動態規劃,遞迴函式
public static int getNums(int n,int m) {
// 遞迴函式結束條件
if( n ==0 || m == 0){ return
1; } else {
        // n,m的走法,等於 n-1,m與n,m -1相加
return getNums(n - 1, m) + getNums(n, m -1); } } }