首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Clojure递归日志表

Clojure递归日志表
EN

Stack Overflow用户
提问于 2020-02-29 06:05:45
回答 2查看 48关注 0票数 0
代码语言:javascript
代码运行次数:0
运行
复制
(ns logtable) 


(defn displayLogTable[start stop step]
    (if (> start stop) nil
        (if < star stop) log10 start)
        (displayLogTable ( + start step) stop step)
        )
))





(defn -main []
    (println "\n Enter your start, stop and step: ")
        (let 
            [ start stop step (Integer/parseInt (read-line))]
            (print (displayLogTable start stop step)
        )

    )

我在尝试实现一个递归函数来打印我的日志表时,收到了一个“if的参数太多”的错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-29 18:40:46

这部分代码中有多个错误:

代码语言:javascript
代码运行次数:0
运行
复制
(defn displayLogTable[start stop step]
    (if (> start stop) nil
        (if < star stop) log10 start)
        (displayLogTable ( + start step) stop step)
        )
))

格式化以使其变得明显:

代码语言:javascript
代码运行次数:0
运行
复制
(defn displayLogTable[start stop step]
  (if (> start stop)
    nil ; 1
    (if <  ;2
      star 
      stop) 
    log10 ; 3
    start) ; 4
  (displayLogTable (+ start step) stop step))
)) ; to much closing parens

if有太多的表单(1-4),其中只有三个允许(if predicate then else)。if at 2的格式正确,但肯定不是您想要的(如果<为true (总是),则为star (拼写错误,很可能是start)否则为stop)。

票数 2
EN

Stack Overflow用户

发布于 2020-03-03 09:07:41

如果我们按照@cfrick's answer所暗示的方式更正您的代码,我们会得到类似于...

代码语言:javascript
代码运行次数:0
运行
复制
(defn displayLogTable [start stop step]
    (if (> start stop)
      nil
      (if (< start stop)
        (Math/log10 start)
        (displayLogTable (+ start step) stop step))))

这没有多大意义。我们可以简化为..。

代码语言:javascript
代码运行次数:0
运行
复制
(defn displayLogTable [start stop step]
  (loop [start start]
    (cond 
      (> start stop) nil
      (< start stop) (Math/log10 start)
      :else (recur ( + start step)))))

同样徒劳无功。看起来您需要的是由startstopstep定义的数字范围的对数序列。在Clojure中实现这一点的一种方法是...

代码语言:javascript
代码运行次数:0
运行
复制
(defn displayLogTable [start stop step]
  (map
    (fn [x] (Math/log10 x))
    (range start stop step)))

例如,...

代码语言:javascript
代码运行次数:0
运行
复制
=> (displayLogTable 1 10 1)
(0.0 0.3010299956639812 0.47712125471966244 0.6020599913279624 0.6989700043360189 
 0.7781512503836436 0.8450980400142568 0.9030899869919435 0.9542425094393249)

请注意,range包含起点(0),但不包括终点(10)。

Clojure处理sequences (这里有maprange )的方法通常是解决此类问题的关键。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60459849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档