gpt4 book ai didi

functional-programming - Racket 博士,帮助从列表中获取元素

转载 作者:太空宇宙 更新时间:2023-11-03 18:54:26 25 4
gpt4 key购买 nike

我正在 Dr. Racket 中开发有限状态机,需要一些帮助来提取我的转换函数中的下一个状态。

现在,我不会检查以确保字符串中的字符与字母表匹配,或者最终状态是否在最终状态列表中,或者任何其他状态,直到我可以递归地从一个状态转换到另一个状态.

这是我现在的位置:

#lang racket
(require math/array)

(define in_string (list "a" "b" "b" "b"))
(define alphabet (list "a" "b"))
(define initial_state 0)
(define final_states (list 2))
(define delta_fn (list
(list 0 "a" 0)
(list 0 "b" 1)
(list 1 "a" 0)
(list 1 "b" 1)))

(define current_state initial_state)

(define (transition current_state in_string delta_fn)
(writeln current_state)
(writeln in_string)
(writeln delta_fn)
(cond
[(empty? in_string) (writeln current_state)]
[else
(let ([input (car in_string)])
(set! current_state (filter (lambda (v)
(match v
[(list (== current_state) (== input) _) #t]
[_ #f]))
delta_fn)))
(writeln current_state)]
;(transition current_state in_string delta_fn)]
)
)

所以目前,如果您运行此脚本并输入:(transition current_state in_string delta_fn),您将获得以下输出:

> (transition current_state in_string delta_fn)
0
("a" "b" "b" "b")
((0 "a" 0) (0 "b" 1) (1 "a" 0) (1 "b" 1))
((0 "a" 0))

最后一行:((0 "a"0)) 是 (writeln current_state) 命令在 lambda 函数运行以在 delta_fn 列表中找到其匹配项后的结果。我以为我可以直接在此处键入 (cdr (cdr current_state)) 以获得该输出中的第三项,但是 ((0 "a"0)) 不是列表,我不能像列表一样对其进行操作。

所以我的问题是:什么是 ((0 "a"0))?为什么将 current_state 设置为那个而不是 '(0 "a"0)?

任何帮助将不胜感激,请知道我对一般的函数式编程非常陌生,所以使用小词 =P


解决方案!

(define (transition current_state in_string delta_fn)
(cond
[(empty? in_string) (writeln current_state)]
[else
(let ([input (car in_string)])
(set! filtered_delta_fn (filter (lambda (v)
(match v
[(list (== current_state) (== input) _) #t]
[_ #f]))
delta_fn)))
(set! next_state (car (cdr (cdr (car filtered_delta_fn)))))
(transition next_state (cdr in_string) delta_fn)]
)
)

最佳答案

您正在重用变量 current_state .不要那样做!

首先是0,初始状态。

然后您将其更改为包含一个完全不同的值,即 filter 的结果手术。相反,为此使用一些临时变量,所以 current_state还没有改变。

现在,filter返回您询问的值,((0 "a" 0)) ,因为 delta_fn 中的所有条目它保留了符合您标准的那个,列表 (0 "a" 0) .因此过滤后的列表中包含一个匹配项。

要从中找到你的下一个状态,只需调用

(set! next_state (car (cdr (cdr (car filtered_delta_fn)))))
; (0 "a" 0)
; ("a" 0)
; (0)
; 0

哪里filtered_delta_fn将是上面提到的临时变量。

那么,递归调用就是

(transition next_state in_string delta_fn)

你可以使用 current_state代替 next_state ,但这太乱了。最好让所有变量都有意义,并使用与其含义相对应的适当值。否则,很容易很快迷失在所有复杂的困惑中。

此外,使用 set!通常不受欢迎。在 Scheme 中,我们通常会声明一个新的变量,以便以后使用,例如

    (let ((next_state (car (cdr ..... ))))
; recursive call .....

关于functional-programming - Racket 博士,帮助从列表中获取元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47419873/

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