因此,我目前正在学习JavaScript,并且我对人们可以在编程中完成工作的许多不同方式感兴趣。这是我的钻石代码,可以使用给定的奇数:
const l = 11;
let space = ' ';
let star = '*';
let i = 1;
let k;
let n = 0;
while(i <= l) {
k = (l - i)/2;
console.log(space.repeat(k) + star.repeat(i));
i = i + 2;
}
// i = i - 2;
while(i >= 2) {
i = i - 2;
k = (l - i)/2;
if(i < l) { // To get rid of repeating middle line
console.log(space.repeat(k) + star.repeat(i));
} else {
continue;
}
}
还有其他更直观的方法吗?
答案 0 :(得分:3)
您可以采用递归方法并调用该函数,直到获得最长的星形为止。
function diamond(l, i = 1) {
const
STAR = '*',
SPACE = ' ',
LINE = SPACE.repeat((l - i) / 2) + STAR.repeat(i);
console.log(LINE);
if (i >= l) return;
diamond(l, i + 2);
console.log(LINE);
}
diamond(11);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:1)
如果您想使用迭代方法来解决此问题,则可以执行以下操作:
const makeDiamond = n => {
let total = n, iter = 0
const base = ['*'.repeat(n)] // Start with the middle, build out
while((n-=2) > 0) {
const layer = ' '.repeat(++iter)+'*'.repeat(n)
base.unshift(layer) // Prepend layer
base.push(layer) // Append layer
}
base.forEach(l => console.log(l)) // Print each layer in sequence
}
注意:这适用于偶数或奇数大小的钻石。
答案 2 :(得分:1)
创建一个函数以创建第n行。
通过创建一个等于高度一半的数组来创建顶部,并使用line函数将其映射。
加入顶部,然后反转顶部并将其用作底部。
var diamond=n=>(n=Array(Math.round(n/2)).fill().map((v,i)=>" ".repeat((n-i*2+1)/2)+"*".repeat(i*2+1))).join`\n`+'\n'+n.reverse().slice(1).join('\n');
答案 3 :(得分:1)
与reduce
:
const n = 11;
Array.from(Array(~-n/2|0), (_,i) => " ".repeat(i+1) + "*".repeat(n+~i*2))
.reduce((a, c) => [c, ...a, c], ["*".repeat(n)])
.forEach(l=>console.log(l))
~-n/2|0 === Math.floor((n-1)/2)
n+~i*2 === n-(i+1)*2
答案 4 :(得分:0)
我实际上设法创建了另一个类似的代码,该代码使i = i + 2保持运行,而不是在第二个循环中减小它。
const l = 11;
let space = ' ';
let star = '*';
let i = 1;
let k;
let n = 0;
while(i <= l) {
k = (l - i)/2;
console.log(space.repeat(k) + star.repeat(i));
i = i + 2;
}
while(i >= l) {
k = (i - l)/2;
n = i - (4 * k);
if (n > 0) {console.log(space.repeat(k) + star.repeat(n));
} else { break; }
i = i + 2;
}