【发布时间】:2017-03-30 07:15:04
【问题描述】:
我为find-index写了以下函数:
(: finind : (Listof Integer) Integer -> (Option Integer))
;; helper function for find-index
(define (finind a b)
(let loop ((a a) (c 0))
(cond
((empty? a) 'None)
((equal? (first a) b) (Some c))
(else (loop (rest a) (add1 c))))))
(: find-index : (Integer -> Boolean) (Listof Integer)
-> (Option (Pr (Option Integer) Integer)))
;; return the first item to pass the test, if there is one,
;; along with its (0-based) index
(define (find-index f x)
(match x
('() 'None)
((cons hd '())
(if (f hd) (Some (Pr (finind x hd) hd)) 'None))
((cons hd tl)
(if (f hd) (Some (Pr (finind x hd) hd))
(find-index f tl)))))
现在,finind 可以单独使用,但是当我将它与find-index 一起使用时,它只会返回(Some 0)。
(finind (list 45 41 9) 9) 的结果是 (Some 2)。
但是,(find-index (lambda ([t : Integer]) (< t 10)) (list 45 41 9)) 的结果是 (Some (Pr (Some 0) 9)),即使它应该是 (Some (Pr (Some 2) 9))。
所以我知道它可能会发生,因为我有 (finind x hd) 来显示我的索引,并且因为它的 hd 它不会改变。但是我该如何解决呢?我一直在尝试,但徒劳无功。有人可以帮忙吗?谢谢!
【问题讨论】:
-
在最后一个条件下,当谓词为假时,您将递归到
find-index,并且您没有以任何方式传递索引偏移量,因此它无法知道这是您第三次这样做.也许用索引包装并使用它可以解决您的问题。 -
我不明白。能举个例子吗?
-
你没有将
'(45 41 9)传递给finind,你传递的是第一个头部满足f的尾巴,即'(9)。 -
您能否在代码中反映正确的做法?我知道问题所在,但现在如何更改代码以使其正常工作:(
-
@NishantAggarwal 当您通过测试函数
f和'(41 9)时,结果将是(find-index f (cdr '(41 9))),它会找到它,但find-index的实例不知道它正在查看第二个索引,而不是第一个。它会寻找我,因为您也想将函数传递给助手并让find-index只需调用findind或者您可以将助手移动到find-index以便您可以访问f。
标签: functional-programming scheme racket typed-racket