请计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数)从棋盘左上角出发沿着边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。
注:沿棋盘格之间的边缘线行走
数据范围: 1≤n,m≤8
输入描述:
输入两个正整数n和m,用空格隔开。(1≤n,m≤8)
输出描述:
输出一行结果
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void (async function () {
// Write your code here
function fn(m, n) {
if(m==0 || n==0){
return 1;
}else{
return fn(m-1,n)+fn(m,n-1)
}
}
while ((line = await readline())) {
line = line.split(" ");
var num = fn(Number(line[0]), Number(line[1]));
console.log(num);
}
})();
代码的解释
1. 递归函数 fn(m, n)
fn(m, n)是一个递归函数,用来计算从左上角到右下角的路径数量。假设有一个 m * n 的棋盘:
-
递归终止条件:当
m或n为 0 时,返回 1。因为如果有一行或一列的格子数为 0(即沿着棋盘的边缘),只能沿边缘走,唯一的路径就是一直走下去或一直走右边。 -
递归公式:如果
m > 0且n > 0,则:-
从
(m, n)到右下角,可以通过从(m-1, n)(即上面一个格子)或(m, n-1)(即左边一个格子)到达。所以路径数是:fn(m-1, n) + fn(m, n-1)
这就意味着:从
(m, n)这个位置,路径数等于从它的上方格子加上从它的左方格子的路径数。 -
2. 主程序逻辑
iter = rl[Symbol.asyncIterator]();:这行代码用来创建一个异步的读取迭代器,rl是输入数据,表示异步读取输入。const readline = async () => (await iter.next()).value;:定义readline函数来读取输入行。
3. 主执行函数 async function ()
-
在主执行函数内部:
- 调用
readline()获取输入行,然后分割成两个数字n和m。 - 使用递归函数
fn(Number(line[0]), Number(line[1]))计算从左上角到右下角的路径数。 - 最后,使用
console.log(num)输出结果。
- 调用