scheme和prolog中相邻重复项的计数

scheme和prolog中相邻重复项的计数,prolog,scheme,Prolog,Scheme,我不熟悉scheme和prolog,只做过几个基本问题。 我需要在scheme和prolog中编写一个函数来计算列表中相邻的重复次数 例如:(Count'(1,1,1,2,3,3,1))给出((31)(12)(23)(11)) 我不想要的代码,因为这是家庭作业,但任何提示或如何思考这个问题将不胜感激,因为我不知道从哪里开始 让我们看一个假设函数循环: (循环待办事项完成) 这会将todo中的列表重写为您想要的格式 并且done包含已处理的零件 (loop '(1 1 1 2 3 3 1) '()

我不熟悉scheme和prolog,只做过几个基本问题。 我需要在scheme和prolog中编写一个函数来计算列表中相邻的重复次数

例如:
(Count'(1,1,1,2,3,3,1))
给出
((31)(12)(23)(11))


我不想要的代码,因为这是家庭作业,但任何提示或如何思考这个问题将不胜感激,因为我不知道从哪里开始

让我们看一个假设函数
循环

(循环待办事项完成)

这会将
todo
中的列表重写为您想要的格式 并且
done
包含已处理的零件

(loop '(1 1 1 2 3 3 1) '())
(loop   '(1 1 2 3 3 1) '((1 1))
(loop     '(1 2 3 3 1) '((1 2))
(loop       '(2 3 3 1) '((1 3))
(loop         '(3 3 1) '((2 1) (1 3))
(loop           '(3 1) '((3 1) (2 1) (1 3))
(loop             '(1) '((3 2) (2 1) (1 3))
(loop              '() '((1 1) (3 2) (2 1) (1 3))
'((1 1) (3 2) (2 1) (1 3)
给定这样一个函数
循环
,您可以编写

(define (count xs) 
    (reverse loop xs '())
<>现在为了实现<代码>循环< /代码>,您需要考虑以下情况:

1) todo is empty
2) done is empty
3) the first element of todo is different from the first element of done
3) the first element of todo is the same as the first element of done

解决长度为0和1的列表的(普通)问题。然后通过递归在列表的开头使用两个相同的数字来解决这个问题。最后,解决头部有两个不相同数字的情况。您可能需要对prolog的搜索树进行修剪(即防止它在第一个搜索树之后找到更多的解决方案)。“我需要在scheme和prolog中编写一个函数…”。在Prolog中,您编写的是谓词,而不是函数!这就是所谓的“运行长度编码”,也许你在搜索时运气会更好一些(定义(循环lst)(let((x 0))(cond((null?lst))((null?cdr lst)((+x 1)(cons x car lst))((eq?(car lst)(cadr lst))(+x 1)(cons x car lst)(循环cddr lst))((而不是eq?(car lst)(cdr lst)))(循环lst))