gpt4 book ai didi

list - 如何获取列表方案和序言的第一个、中间和最后一个元素?

转载 作者:行者123 更新时间:2023-12-04 00:27:17 25 4
gpt4 key购买 nike

我正在尝试在 Scheme 和 Prolog 中编写一个函数,该函数返回列表的第一项、中间项和最后一项。例如,find([4,5,8,7,9],L), L = [4,8,9]

我想出了这段 Scheme 语言的代码,但我是 Prolog 的新手,了解不多,所以我如何在 Prolog 中得到相同的结果?

(define (frst L)
(car L))

(define (last L)
(if (null? (cdr L))
(car L)
(last (cdr L))))

(define (nth L x)
(if (= x 1)
(car L)
(nth (cdr L) (- x 1))))

(define (firstMidLast L)
(list (frst L)
(nth L (ceiling (/ (length L) 2)))
(last L)))

最佳答案

这是另一种方法!

  • “技巧”是以两种不同的速度同一个列表。
  • 第一个参数索引使目标 list_first_mid_last(+,?,?,?) 具有确定性。

我们这样定义 list_first_mid_last/4:

list_first_mid_last([E|Es],E,M,L) :-
ahead_of_mid_last([E|Es],[E|Es],M,L).

ahead_of_mid_last([],[M|_],M,M).
ahead_of_mid_last([F|Fs],Es,M,L) :-
more_ahead_of_mid_last(Fs,F,Es,M,L).

more_ahead_of_mid_last([],L,[E|_],E,L).
more_ahead_of_mid_last([F|Fs],_,Es,E,L) :-
evenmore_ahead_of_mid_last(Fs,F,Es,E,L).

evenmore_ahead_of_mid_last([],L,[E|_],E,L).
evenmore_ahead_of_mid_last([F|Fs],_,[_|Es],M,L) :-
more_ahead_of_mid_last(Fs,F,Es,M,L).

让我们运行一些查询并将 Prolog1 和 Scheme2 结果并排放置!

%  Prolog                                     % ; Scheme?- list_first_mid_last([1],F,M,L).            % > (firstMidLast `(1))F = M, M = L, L = 1.                          % (1 1 1)                                              %?- list_first_mid_last([1,2],F,M,L).          % > (firstMidLast `(1 2))F = M, M = 1, L = 2.                          % (1 1 2)                                              %?- list_first_mid_last([1,2,3],F,M,L).        % > (firstMidLast `(1 2 3))F = 1, M = 2, L = 3.                          % (1 2 3)                                              %?- list_first_mid_last([1,2,3,4],F,M,L).      % > (firstMidLast `(1 2 3 4))F = 1, M = 2, L = 4.                          % (1 2 4)                                              %?- list_first_mid_last([1,2,3,4,5],F,M,L).    % > (firstMidLast `(1 2 3 4 5))F = 1, M = 3, L = 5.                          % (1 3 5)                                              %?- list_first_mid_last([1,2,3,4,5,6],F,M,L).  % > (firstMidLast `(1 2 3 4 5 6))F = 1, M = 3, L = 6.                          % (1 3 6)                                              %?- list_first_mid_last([1,2,3,4,5,6,7],F,M,L).% > (firstMidLast `(1 2 3 4 5 6 7))F = 1, M = 4, L = 7.                          % (1 4 7)

脚注 1: 使用 版本 7.3.11(64 位)。
脚注 2: 使用 口译员SCM版本 5e5(64 位)。

关于list - 如何获取列表方案和序言的第一个、中间和最后一个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30112114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com