Clojure学习3-----实战练习

1. 如果我们要列出 10 以下且为 3 或 5 的倍数的所有自然数,我们将得到 3、5、6 和 9。这几个数的和是 23。我们的题目是求出 1,000 以下且为 3 或 5 的倍数的自然数的和。
;;定义函数
(defn divisible-by-3-or-5 [num] (or (== (mod num 3) 0)(== (mod num 5) 0)))

;;调用函数
(reduce + (filter divisible-by-3-or-5 (range 1000)))
=> 233168

;;100以内的3或者5的倍数的所有自然数之和
(reduce + (filter divisible-by-3-or-5 (range 100)))
=> 2318
2. 现在又一个矢量,矢量中有多个清单,每个清单有:month,:val,:s1,:s2四个键值,矢量为:
(def entries [{:month 1 :val 12 :s1 true :s2 false}
              {:month 2 :val 3 :s1 false :s2 true}
              {:month 3 :val 32 :s1 true :s2 false}
              {:month 4 :val 18 :s1 true :s2 false}
              {:month 5 :val 32 :s1 false :s2 true}
              {:month 6 :val 62 :s1 false :s2 true}
              {:month 7 :val 12 :s1 false :s2 true}
              {:month 8 :val 142 :s1 true :s2 false}
              {:month 9 :val 52 :s1 true :s2 false}
              {:month 10 :val 18 :s1 true :s2 false}
              {:month 11 :val 23 :s1 false :s2 true}
              {:month 12 :val 56 :s1 false :s2 true}])
  1. 求出:s1为true的所有项 ?
(filter #(:s1 %) entries)
=>
({:month 1, :val 12, :s1 true, :s2 false}
 {:month 3, :val 32, :s1 true, :s2 false}
 {:month 4, :val 18, :s1 true, :s2 false}
 {:month 8, :val 142, :s1 true, :s2 false}
 {:month 9, :val 52, :s1 true, :s2 false}
 {:month 10, :val 18, :s1 true, :s2 false})
  1. 求出:val大于30并且:s2为true的所有项?
(filter #(and (:s2 %) (> (:val %) 30)) entries)
=>
({:month 5, :val 32, :s1 false, :s2 true}
 {:month 6, :val 62, :s1 false, :s2 true}
 {:month 12, :val 56, :s1 false, :s2 true})

(:s2 %)是去除所有:s2为true的项,(:val %)是去除:val键对应的val,%表示匿名函数的参数,(> (:val %)30)是取出:val对应的值大于30。

(def entries1 [{:month 1 :val "hello" :s1 true :s2 false}
               {:month 2 :val "nam" :s1 false :s2 true}
               {:month 3 :val "cx" :s1 true :s2 false}
               {:month 4 :val "cx" :s1 true :s2 false}
               {:month 5 :val "cx" :s1 false :s2 true}
               {:month 6 :val "cx" :s1 false :s2 true}
               {:month 7 :val "nam" :s1 false :s2 true}
               {:month 8 :val "nam" :s1 true :s2 false}
               {:month 9 :val "hello" :s1 true :s2 false}
               {:month 10 :val "hello" :s1 true :s2 false}
               {:month 11 :val "font" :s1 false :s2 true}
               {:month 12 :val "font" :s1 false :s2 true}])
  1. 取出:s2为true并且:val为”cx"的所有项?
(filter #(and (:s2 %) (= (:val %) "cx")) entries1)
=> ({:month 5, :val "cx", :s1 false, :s2 true}
	 {:month 6, :val "cx", :s1 false, :s2 true})
  1. 根据:val值对entries1进行分组?
;;分组函数
(defn grouped-by-keys
  ([data group-keys]
   (->> data
        (group-by (fn [m] (select-keys m group-keys)))
        (reduce-kv (fn [m k v]
                     (assoc m k {:list
                                 (mapv
                                    (fn [e]
                                     (apply dissoc e group-keys))
                                    v)}))
                   {})
        (mapv (fn [e] (apply merge e))))))

调用函数进行分组:

(grouped-by-keys entries1 [:val])
=>
[{:val "hello",
  :list [{:month 1, :s1 true, :s2 false}
   		 {:month 9, :s1 true, :s2 false}
        {:month 10, :s1 true, :s2 false}]}
 {:val "nam",
  :list [{:month 2, :s1 false, :s2 true} 
         {:month 7, :s1 false, :s2 true}
         {:month 8, :s1 true, :s2 false}]}
 {:val "cx",
  :list [{:month 3, :s1 true, :s2 false}
         {:month 4, :s1 true, :s2 false}
         {:month 5, :s1 false, :s2 true}
         {:month 6, :s1 false, :s2 true}]}
 {:val "font",
  :list [{:month 11, :s1 false, :s2 true} 
         {:month 12, :s1 false, :s2 true}]}]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值