0

所以这只是我在 IBM Swift 沙箱中的乐趣。我最近在 Scala 中做了一个 L-system algae,虽然在 Swift 中做它来看看语言的比较会很酷。

https://github.com/I2obiN/L-System-Algorithms-and-Fractals/blob/master/algae.scala

那是向你展示我的目标的 Scala,这就是我在 Swift 中所拥有的;

/**
  * Created by t.hood on 26/01/16
  * L-System Algae
  *
  */

 import Foundation

 // Mapping function for string

 func stringmap(x: String) -> String {
 var str = x;

     // Replace characters in string
     str = x.stringByReplacingOccurrencesOfString("A", withString: "AB") +
     str.stringByReplacingOccurrencesOfString("B", withString: "A");

  // Return mapped string;
  return str;
 }

 func lsys() {

 // Declarations

 var iteration : Int = 2;
 var x = 0;
 var lsystem: String = "A";
 let charA: Character = "A";
 let charB: Character = "B";

 while(x != iteration) {

 print(lsystem)

  // Iterate through characters in string
  for chars in lsystem.characters {
    lsystem = stringmap(lsystem);
  }

  // Inc count ..
  x+=1

 }
}

 // Run ..
 lsys();

我遇到的问题在于我的映射功能。我需要它来映射 x,打印结果,然后在 str 上执行下一个映射。问题是我在两个地图之间都有运算符 + 并且在第一次操作后我无法快速打印 str 。

有人对如何解决这个问题有任何想法吗?如果我可以在第一次替换后打印 str 我认为它会起作用。

4

1 回答 1

0

我在 Xcode 中创建了一个项目,因此我可以使用调试器查看发生了什么。这是我发现的。

我将你的 print 语句移到了 for 循环中,这样每次循环执行时它都会显示 lsystem 的值。

while循环执行了两次,当x == 0和1时第一次通过while循环lsystem == 'A',所以for循环执行了一次。在 stringmap() 中,“A”变为“ABA”。'ABA' 被打印出来。第二次通过 while 循环,for 循环被执行了 3 次。对于循环 1:“ABA”被发送到 stringmap() 并返回“ABBABAA”。对于循环 2:'ABBABAAAA' 被发送到 stringmap() 并返回 'ABBBABBABABABAAAAAAAA'。对于循环 3:“ABBBABBABABABAAAAAAAA”被发送到 stringmap() 并返回“ABBBBABBBABBABBABBABABABABABABABABAAAAAAAAAAAAAAAAAA”。

我修改了您的 stringmap() 函数,以逐个字符地遍历字符串并将语法应用于每个字符,将每个更改附加到一个新字符串,然后将其返回给 lsys()。

while 循环的七次迭代返回了这个,这与我在维基百科关于 L 系统的文章中看到的一致。迭代 0:A 迭代 1:AB 迭代 2:ABA 迭代 3:ABAAB 迭代 4:ABAABABA 迭代 5:ABA ABABAABAAB 迭代 6:ABAABABAABA ABABAABABA 迭代 7:ABA ABABAABA ABABAABAABAABAABAABAAB

这是代码。这在我的 iMac 上的操场上工作,我希望它也能在 IBM Swift 沙箱中工作。

func stringmap(x: String) -> String
{
    var returnString = ""

    for char in x.characters
    {
        switch (char)
        {
        case "A" :
            returnString += "AB"
            break
        case "B":
            returnString += "A"
            break
        default:
            break
        }
    }
    return returnString
}


func lsys()
{

    // Declarations

    let iteration : Int = 7;
    var x = 0;
    var lsystem: String = "A";

    print("Iteration \(x): \(lsystem)")

    while(x != iteration)
    {
        lsystem = stringmap(lsystem)
        x++
        print("Iteration \(x): \(lsystem)")

    }
}

lsys()
于 2016-03-22T20:31:19.627 回答