2014-10-06 44 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) 

輸出:

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

評論。我認爲雙循環過於複雜。