gpt4 book ai didi

Clojure seq返回函数与seq的直接 'def'

转载 作者:行者123 更新时间:2023-12-01 23:22:44 25 4
gpt4 key购买 nike

新手 Clojure 问题。以下两种实现/表示斐波那契数列的方法的优缺点是什么? (特别是,有没有什么可以完全排除一个或另一个坏主意。)

(ns clxp.fib
(:gen-class))

; On the one hand, it seems more natural in code to have a function that
; returns 'a' Fibonacci sequence.
(defn fib-1
"Returns an infinite sequence of Fibonnaci numbers."
[]
(map first (iterate (fn [[a b]] [b (+ a b)]) [0 1])))

; > (take 10 (fib-1))
; (0 1 1 2 3 5 8 13 21 34)

; On the other hand, it seems more mathematically natural to define 'the'
; Fibonacci sequence once, and just refer to it.
(def fib-2
"The infinite sequence of Fibonnaci numbers."
(map first (iterate (fn [[a b]] [b (+ a b)]) [0 1])))

; > (take 10 fib-2)
; (0 1 1 2 3 5 8 13 21 34)

a) 这两种定义无限序列的方法的优缺点是什么? (我知道这是一个有点特殊的情况,因为这个特定的序列不需要提供任何参数 - 不像,比如说,'n'的倍数的无限序列,我认为这需要第一种方法,以便指定'n' 的值。)

b) 是否有任何总体理由偏爱这些实现中的一种而不是另一种? (内存消耗,用作参数时的适用性等)

最佳答案

如果多次查找其元素,

fib-2 有利于时间性能,因为在惰性序列中,它们只需要计算一次。

由于全局绑定(bind),seq 不太可能成为垃圾收集器,因此如果您的程序将通过一百万次斐波那契来进行一次计算,如果它不需要保持 seqs 头,调用本地上下文中的 fib-1 有利于空间性能。

关于Clojure seq返回函数与seq的直接 'def',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30346133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com