2014-10-06 82 views
2

使用以下:斯威夫特。用于循环迭代。

​​

我可以进行以下模式:

* 
** 
*** 

我试图写输出高度的侧向三角形函数的2n-1和宽度为n,所以输出为N = 4将是:

* 
** 
*** 
** 
* 

func triangle(triangleSides: Int) 
{ 
    var y = 0 
    var x = 0 
    var index: Int 

    for _ in 1...triangleSides { 
     y = y + 1 

     var stringBuilder = String() 

     for _ in 1...y 
     { 
      stringBuilder += "*" 
     } 

     println(stringBuilder + "\n") 

    } 

    for _ in 1..<triangleSides{ 
     x = triangleSides - 1 


     var index: Int 
     var stringBuilder = String() 

     for index in stride(from: triangleSides - 1, through: 1, by: -1) { 
      stringBuilder += "*" 
     } 


     println(stringBuilder + "\n") 


    } 
} 

我得到

* 
** 
*** 
** 
** 

很明显,它会是我这样做的问题,我试图做到这一点。如果有人能够指出我会赞赏的正确方向。

感谢

+0

了解如何使用调试器和断点来调试程序 – 2014-10-06 23:20:07

回答

1

嗯,有你这样做,你并不真的需要做相当多的事情......但是,你的主要问题是,你的第三和第四for循环是错误的。

现在是,它是从1循环,从而在外环triangleSides - 1triangleSize - 11在内部循环的方式。由于您没有使用for循环的实际索引,这只会使外部和内部循环运行triangleSides - 1次。

你想要做的是在你的外循环中从triangleSize - 1循环到1,并在你的内循环中循环1到外循环的当前值。如果让for循环完成它的工作并直接指定x而不是忽略循环索引_并手动计算x,它会更容易。

这些变化应该是这样的(只在第二组for环路):

for x in stride(from: triangleSides - 1, through: 1, by: -1) { 
    var stringBuilder = String() 

    for _ in 1...x { 
     stringBuilder += "*" 
    } 

    println(stringBuilder + "\n") 
} 

如果你想要把它清理干净多一点,你也可以让for循环完成自己的工作中第一组的循环,并在你的函数开始摆脱xy,并且index的声明:

func triangle(triangleSides: Int) 
{ 
    for y in 1...triangleSides { 
     var stringBuilder = String() 

     for _ in 1...y 
     { 
      stringBuilder += "*" 
     } 

     println(stringBuilder + "\n") 

    } 

    for x in stride(from: triangleSides - 1, through: 1, by: -1) { 
     var stringBuilder = String() 

     for _ in 1...x { 
      stringBuilder += "*" 
     } 

     println(stringBuilder + "\n") 
    } 
} 

现在,这样的:

triangle(3) 

输出:

* 
** 
*** 
** 
* 
+0

非常感谢你的帮助。而解释的东西更进一步。我正在研究一些旧的C简单I/O示例,并且让我的事情比需要更令人困惑。 – 2014-10-07 00:22:01

1

这里是我的版本:

func triangle(triangleSides: Int) 
{ 
    var y = 0 
    var x = 0 
    var index: Int 
    var stringBuilder = "" 

    for _ in 1...triangleSides { 
     stringBuilder += "*" 
     println(stringBuilder) 
    } 

    for z in reverse(1..<triangleSides) { 
     let index = advance(stringBuilder.endIndex, -1) 
     stringBuilder = stringBuilder.substringToIndex(index) 
     println(stringBuilder) 
    } 
} 

triangle(4) 

输出:

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

评论。我认为双循环过于复杂。