帮帮同学在设计一个文字碰碰消游戏,规定"五"和"八"形成"五八"组合碰到一起即会消除,("八五" 不会消除)。
例如 "五八", "五八五八", "五五八八"。说明: "五五八八" 是内层的"五八"碰在一起消除后,外层的"五八"会碰在一起消除。
帮帮同学想知道n个"五"和"八"组成的字符串中,有多少种组合可以满足消除为空字符串。
现为帮帮同学设计一个方法,输入整数n,表示"五"和"八"的数量,返回n个"五"和n个"八"组成的字符串中,满足消除为空字符串的组合数。
帮帮同学在设计一个文字碰碰消游戏,规定"五"和"八"形成"五八"组合碰到一起即会消除,("八五" 不会消除)。
例如 "五八", "五八五八", "五五八八"。说明: "五五八八" 是内层的"五八"碰在一起消除后,外层的"五八"会碰在一起消除。
帮帮同学想知道n个"五"和"八"组成的字符串中,有多少种组合可以满足消除为空字符串。
2
2
满足的组合 [ '五五八八', '五八五八' ]
3
5
满足的组合 [ '五五五八八八', '五五八五八八', '五五八八五八', '五八五五八八', '五八五八五八' ]
"五五八八" 是内层的"五八"碰在一起消除后,外层的"五八"会碰在一起消除。
// 参考:**的22-括号生成 // 思路:使用回溯记录数量,五看成左括号,八看成右括号 // 不符合的条件的直接剪枝 /** * 输入整数n,返回可消除为空字符串的的n组"五八"字符串数量。 * @param n int整型 * @return int整型 */ function getTargetNumber(n) { let res = 0; backtracing(n, n); return res; function backtracing(fi, ei) { if (fi == 0 && ei == 0) { res++; return; } if (fi > 0) { backtracing(fi - 1, ei); } // 保证八比五少 if (ei > fi) { backtracing(fi, ei - 1); } } } module.exports = { getTargetNumber: getTargetNumber, };
function getTargetNumber(n) { //对外封装只保留可传入参数n function nsum(x, n) { //n为层数,累加开始的底数,x为顶数,由上层递归累加过程中传入 if (n === 0) return 1 //如果层数为0,则返回1作为递归终点 var s = 0 for (var i = n; i <= x; i++) { s = s + nsum(i, n - 1) } return s } return nsum(n, n) }