1

我正在尝试在 clojure 中编写一个基于循环的 Fizz Buzz。它似乎适用于非 Fizz 或 Buzz 的值,但对于 Fizz 和 Buzz 的值,它返回 nil。

代码:

(ns fizz-buzz.core
  (:gen-class))

(defn fizz-buzz [value]
  (let [fizz (cycle ["" "" "Fizz"])
        buzz (cycle ["" "" "" "" "Buzz"])
        fb (map str fizz buzz)]
    (nth (map-indexed 
           (fn [i v] 
             (if (clojure.string/blank? v)
               (str (+ i 1)
               v)))
           fb)
         (- value 1)))

测试:

(ns fizz-buzz.core-test
  (:require [clojure.test :refer :all]
            [fizz-buzz.core :refer :all]))

(deftest value-2-will-return-2 
  (testing "2 will return the string 2"
    (is (= "2" (fizz-buzz 2)))))

(deftest value-4-will-return-4 
  (testing "4 will return the string 4"
    (is (= "4" (fizz-buzz 4)))))

(deftest value-3-will-return-fizz
  (testing "3 will return the string Fizz"
    (is (= "Fizz" (fizz-buzz 3)))))

(deftest value-5-will-return-buzz
  (testing "5 will return the string Buzz"
    (is (= "Buzz" (fizz-buzz 5))))

前两个测试有效(2 和 4),但 Fizz 和 Buzz 测试无效。我确信我不明白地图索引是如何工作的。

4

1 回答 1

5

你的if陈述中有一个非常轻微的括号错位。这意味着您没有else理由if(因此nil结果)

尝试重写:

(if (clojure.string/blank? v)
           (str (+ i 1)
           v)))

作为:

(if (clojure.string/blank? v)
           (str (+ i 1))
           v))

ps - 看起来你已经理解 map-indexed 很好:)

于 2013-07-22T12:49:47.173 回答