递归地使用javascript函数制作星形三角形

时间:2016-09-24 15:03:51

标签: javascript recursion

我对编程很新,我开始了解JavaScript,而且我刚刚学会了递归的概念。现在给我一个问题,创建一个函数(如const f = function(n) { }),如果我们用f(5)调用函数,我们应该看到:

     *
    ***
   *****
  *******
 *********

垂直星的数量必须由输入确定。 我必须在/ while / do-while中使用no;递归只能循环。

我已经提出了这个代码来连接5颗星

const f = function(n) {
  if (n === 0) {
    return "";
  }
  return  "*" +  f(n - 1);
};

 console.log(f(5));

虽然,我不知道如何制作三角形,我该怎么办?

7 个答案:

答案 0 :(得分:4)

您可以使用此代码:

const f = function(chr, n) {
  if (n === 0) {
    return "";
  }
  return  chr +  f(chr, n - 1);
};
const g = function(max) {
   const inner = function(n) {
       if (n > 1) {
           inner(n-1);
       }
       console.log(f(' ', max-n) + f('*', (n*2)-1));
   };
   inner(max);
};
g(5);

答案 1 :(得分:1)

请查看并播放以下示例

function pyramid(n, row = 0, level = '') {

if (row === n) {
    return
}

if (level.length === n * 2 - 1) {
    console.log(level)
    return pyramid(n, row + 1)
}

const midpoint = Math.floor((2 * n - 1) / 2)

let add;
if (midpoint - row <= level.length && midpoint + row >= level.length) {
    add = '#'
} else {
    add = ' '
}

pyramid(n, row, level + add)
}

pyramid(3)

答案 2 :(得分:0)

您使用

走在正确的道路上
 if (n === 0) ...

f(n-1)

这些都是正确的。

现在你只需要在每个函数调用中输出正确数量的星号。请查看string.repeat()

如果您想查看完整的解决方案,而不只是提示:here是我的解决方案。

答案 3 :(得分:0)

我想出了这个,这就是我需要的东西

const astx = function(n){
    if(n===0){
        return "";
    }
    return '*' + astx(n-1);
};

const space = function(n){
    if(n===0){
        return "";
    }
    return ' '+space(n-1);
};

const line = function(n, all){
    if(n === all+1)
        return;

    console.log(space(all-n) + astx(2*n - 1));

    line(n+1,all);
};

const triangle = function(n){
    line(1,n);
};

triangle(5);

答案 4 :(得分:0)

function recursiveStar(n){
if(n === 0) return 0;
recursiveStar(n - 1);
return console.log('*'.repeat(n));
}
recursiveStar(5)

答案 5 :(得分:0)

您可以尝试

function pyramid(n, row = 0) {
  if (n === row) return;
  let midpoint = Math.ceil((n + n - 1) / 2);
  let str = "";
  for (let j = 1; j <= n + n - 1; j++) {
    if (j <= midpoint + row && j >= midpoint - row) str += "#";
    else str += " ";
  }
  console.log(str);
  pyramid(n, row + 1);
}

pyramid(5);

答案 6 :(得分:0)

由于这个老问题最近又被提出来了,下面是一个替代版本,该深度将深度视为常量并重复出现在行号上:

const pyramid = (n, r = 0) => 
  r > n - 1 
    ? '' 
    : ' '.repeat ((n - 1 - r)) + '*'.repeat ((2 * r + 1)) + '\n' + pyramid (n, r + 1) 

console .log (pyramid (5))

我们使n保持固定,将r从零开始,然后递归递增r直到大于n。在我们的基本情况下,当n0r0时,我们得到r > n - 1,并返回一个空字符串。递归的情况是通过在第一行中添加正确的空格数,正确的开始数,然后通过递增r并重复计算剩余的行来进行的。

const pyramid = (n, r = 0) => 
  r > n - 1 
    ? '' 
    : ' ' .repeat ((n - 1 - r)) + '*' .repeat ( (2 * r + 1)) + '\n' + pyramid (n, r + 1) 
//    `-----------------------'   `------------------------'   `--'   `----------------'
//                |                           |                  |             |
//                |                           |                  |             +-- next rows
//                |                           |                  +---------------- line break
//                |                           +----------------------------------- asterisks
//                +--------------------------------------------------------------- empty spaces

唯一的棘手问题是计算正确的恒星和空间数量。很容易看出,对于pyramid (5),空格应该从4稳定地减小到0,而星号应该从1增大到9。这些分别由公式n - 1 - r2 * r + 1捕获。

这最初是用于分配的,并且如果该分配不允许我们使用String.prototype.repeat,那么我们可以在这样的函数中轻松编写自己的递归版本:

const repeat = (c, n) => 
  n < 1 ? '' : c + repeat (c, n - 1)

const pyramid = (n, r = 0) => 
  r > n - 1 
    ? '' 
    : repeat (' ', (n - 1 - r)) + repeat ('*', (2 * r + 1)) + '\n' + pyramid (n, r + 1)