为什么我的if语句不起作用?

Age*_*404 1 if-statement list clojure

我是Clojure的新手,也是函数式编程的新手.我希望这会返回True或False,但它只是无限递归而且它似乎根本没有真实.

我的测试数据集如下:

(def y (list 1 2 3 4)) ; and I'm passing in 2 for X.


(defn occursIn [x y]
    (if (= y nil) 
        "False"
        (if (= x first y )
            "True"  
            (occursIn x (rest y))
        )
    )

)
Run Code Online (Sandbox Code Playgroud)

Ósc*_*pez 5

试试这个,并请注意推荐的方式来格式化你的代码-不要离开自己的线路孤独的括号,他们喜欢{}在其他编程语言:

(defn occursIn [x y]
  (if (empty? y) 
      "False"
      (if (= x (first y))
          "True"  
          (occursIn x (rest y)))))
Run Code Online (Sandbox Code Playgroud)

你忘了打电话first给这个y名单,如下:

(first y)
Run Code Online (Sandbox Code Playgroud)

另外,请注意基本情况不按预期工作.请改用此测试:

(empty? y)
Run Code Online (Sandbox Code Playgroud)

为了完整起见,这里有一个更惯用的方法来编写相同的过程 - 但要注意@omiel在注释中指出的边缘情况,如果xfalse或者这将无效nil:

(defn occursIn [x y]
  (if (some #(= x %) y)
      "True"
      "False"))
Run Code Online (Sandbox Code Playgroud)

一个更好的解决方案,没有边缘案例 - 正如@mange在评论中所建议的那样:

(defn occursIn [x y]
  (if (every? #(not= x %) y)
      "False"
      "True"))
Run Code Online (Sandbox Code Playgroud)