在邮件列表和在线讨论中经常出现的主题之一是进行计算机科学学位的优点(或缺乏).似乎一次又一次地为负面派对提出的论点是,他们已编码了若干年,他们从未使用过递归.
所以问题是:
随着美国本周大量的15亿美元彩票,我在Ruby中编写了一个函数来制作强力球.在Powerball中,您可以从范围中选择5个数字1..69(没有重复项),并从该范围中选择1个数字1..26.
这就是我想出的:
def pball
Array(1..69).shuffle[0..4].sort + [rand(1..26)]
end
Run Code Online (Sandbox Code Playgroud)
它的工作原理是创建一个从1到69的整数数组,对该数组进行混洗,选择前5个数字,对它们进行排序,最后添加1到26之间的数字.
要在Swift中执行此操作需要更多的工作,因为Swift没有内置shuffle方法Array.
这是我的尝试:
func pball() -> [Int] {
let arr = Array(1...69).map{($0, drand48())}.sort{$0.1 < $1.1}.map{$0.0}[0...4].sort()
return arr + [Int(arc4random_uniform(26) + 1)]
}
Run Code Online (Sandbox Code Playgroud)
由于没有shuffle方法,因此可以通过[Int]在范围内创建with值来实现1...69.然后它map用于创建[(Int, Double)]一个元组对数组,其中包含数字和Double范围内的随机数0.0 ..< 1.0.然后,它使用Double值对此数组进行排序,并使用秒map返回[Int],然后使用切片[0...4]提取前5个数字并对sort()它们进行排序.
在第二行中,它在范围中附加一个数字1...26.我尝试将其添加到第一行,但Swift给出了错误:
表达太复杂,无法在合理的时间内解决; 考虑将表达式分解为不同的子表达式.
任何人都可以建议如何将其转换为1行功能?也许有更好的方法来选择5个数字1...69.
关于如何在Swift中创建生成器(或者在Swift中显然调用它们的迭代器)的指南很少,特别是如果您不熟悉该语言.为什么有这么多的发电机类型AnyIterator和UnfoldSequence?为什么下面的代码不应该从单个Ints或s的数组中产生Int?
func chain(_ segments: Any...) -> AnyIterator<Int>{
return AnyIterator<Int> {
for segment in segments {
switch segment {
case let segment as Int:
return segment
case let segment as [Int]:
for i in segment {
return i
}
default:
return nil
}
}
return nil
}
}
let G = chain(array1, 42, array2)
while let g = G.next() {
print(g)
}
Run Code Online (Sandbox Code Playgroud)
我理解它的方式,AnyIterator应该采取{}s中的闭包并将其转换.next()为返回的生成器中的方法,但它似乎不起作用.或者我应该UnfoldSequence像 …
我正在尝试学习函数Swift并开始从Project Euler做一些练习.
甚至Fibonacci数问题2 Fibonacci序列中的每个新项都是通过添加前两个项生成的.从1和2开始,前10个术语将是:
1,2,3,5,8,13,21,34,55,89 ......
通过考虑Fibonacci序列中的值不超过四百万的项,找到偶数项的总和.
根据WWDC高级Swift视频实现了一个memoized斐波那契函数:
func memoize<T:Hashable, U>( body: ((T)->U,T) -> U) -> (T)->U {
var memo = [T:U]()
var result: ((T)->U)!
result = { x in
if let q = memo[x] { return q }
let r = body(result,x)
memo[x] = r
return r
}
return result
}
let fibonacci = memoize { (fibonacci:Int->Double,n:Int) in n < 2 ? Double(n) : fibonacci(n-1) + fibonacci(n-2) }
Run Code Online (Sandbox Code Playgroud)
并实现了一个符合Sequence协议的类
class FibonacciSequence: SequenceType {
func generate() -> GeneratorOf<Double> …Run Code Online (Sandbox Code Playgroud) ...或者如何在for循环条件中使用索引
大家好,因为我们在Swift 3中没有使用c风格的循环,所以我似乎找不到找到一种方式来表达更复杂的循环,因此也许您可以帮帮我。
如果我要写这个
for(int i=5; num/i > 0; i*=5)
Run Code Online (Sandbox Code Playgroud)
快速3我该怎么做?
我关闭的时间是:
for i in stride(from: 5, through: num, by: 5) where num/i > 0
Run Code Online (Sandbox Code Playgroud)
但这当然会一次迭代5个块,如果我是:5、25、125等。
有任何想法吗?
谢谢
我正在尝试将以下实现隐瞒给Swift并遇到困难:
var mem = [];
var fibRecursiveMem = function (n) {
if (mem[n]) return mem[n];
if (n<=2) mem[n] = 1;
else {
mem[n] = fibRecursiveMem(n-1) + fibRecursiveMem(n-2);
}
return mem[n];
}
Run Code Online (Sandbox Code Playgroud)
来自:https : //dev.to/rattanakchea/dynamic-programming-in-plain-english-using-fibonacci-as-an-example-37m1
我在Swift中的实现:
var mem = [Int]()
func fib (_ num: Int) -> Int {
if (mem.count - 1 > num) {
return mem[num]
}
if (num<=2) {mem[num] = 1}
else {
mem[num] = fib(num-1) + fib(num-2)
}
return mem[num]
}
Run Code Online (Sandbox Code Playgroud)
产生索引超出范围的错误。
现在,我想遵循原始算法的一般逻辑。我在翻译中做错了什么?