Scheme 这个函数给了我;程序内存不足;?
我编写了一个名为Scheme 这个函数给了我;程序内存不足;?,scheme,racket,Scheme,Racket,我编写了一个名为(xk处的元素)的函数,它有两个参数:一个listx和一个numberk。它返回列表的第K个元素 例如,表达式(元素位于’(abcd)3)返回c。 然后是一个名为(在xy处删除)的函数,它有两个参数:一个listx和一个numberk。它从列表中删除第K个元素。例如,表达式(remove at'(abcd)3)返回(abd) 在(xy处删除)的定义中,我使用了(xk处的元素)函数,但是(xy处删除)函数不起作用,racket博士给了我“程序内存不足”,有人知道原因并尽快修复吗 (
(xk处的元素)
的函数,它有两个参数:一个listx
和一个numberk
。它返回列表的第K个元素
例如,表达式(元素位于’(abcd)3)
返回c
。
然后是一个名为(在xy处删除)
的函数,它有两个参数:一个listx
和一个numberk
。它从列表中删除第K个元素。例如,表达式(remove at'(abcd)3)
返回(abd)
在(xy处删除)
的定义中,我使用了(xk处的元素)
函数,但是(xy处删除)
函数不起作用,racket博士给了我“程序内存不足”,有人知道原因并尽快修复吗
(define (element-at lis k) (if (null? lis) (if (> k 0) #f '()) (let ((head (car lis)) (tail (cdr lis))) (if (< k 2) head (element-at tail (- k 1))))))
(define (remove-at x y) (let ((first (element-at x y)) (tail x)) (if (equal? (car x) first) (append (remove-at x y) (cdr tail)) (cdr tail))))
(定义(lisk处的元素)(if(null?lis)(if(>k0)#f’())(let((head(car-lis))(tail(cdr-lis)))(if(
首先,如果安排得当,您的代码可以读取
(define (element-at lis k)
(if (null? lis)
(if (> k 0) #f '())
(let ((head (car lis))
(tail (cdr lis)))
(if (< k 2)
head
(element-at tail (- k 1))))))
(define (remove-at x y)
(let ((first (element-at x y))
(tail x))
(if (equal? (car x) first)
(append (remove-at x y) (cdr tail))
(cdr tail))))
(定义(LISK处的元素)
(如果(空?lis)
(如果(>k0)#f'())
(让(头(车里))
(尾部(cdr lis)))
(如果(
为什么使用元素at
在删除at
中分配第一个?为什么要将tail
分配给传入的完整列表?如前所述,即使它没有给您一个内存错误,考虑一下(remove at'(a b c d e f c d)7)
将返回什么,考虑到您如何决定删除哪个元素
如前所述,由于您正在执行(append(在xy处删除)(cdr tail))
,因此您的列表和数字实际上从未变小。您已经编写了一个不接近结果的递归。因此,remove at
将永远旋转,将ingx
附加到它自己的cdr
(除非(car x)
一开始恰好与相等?
到(x y处的元素)
)
我想这是一个家庭作业,所以我只指出了你的错误,把纠正它们作为练习。如果不是这样,请告诉我,这样我们就可以查看工作版本了。首先,如果安排得当,您的代码将显示
(define (element-at lis k)
(if (null? lis)
(if (> k 0) #f '())
(let ((head (car lis))
(tail (cdr lis)))
(if (< k 2)
head
(element-at tail (- k 1))))))
(define (remove-at x y)
(let ((first (element-at x y))
(tail x))
(if (equal? (car x) first)
(append (remove-at x y) (cdr tail))
(cdr tail))))
(定义(LISK处的元素)
(如果(空?lis)
(如果(>k0)#f'())
(让(头(车里))
(尾部(cdr lis)))
(如果(
为什么使用元素at
在删除at
中分配第一个?为什么要将tail
分配给传入的完整列表?如前所述,即使它没有给您一个内存错误,考虑一下(remove at'(a b c d e f c d)7)
将返回什么,考虑到您如何决定删除哪个元素
如前所述,由于您正在执行(append(在xy处删除)(cdr tail))
,因此您的列表和数字实际上从未变小。您已经编写了一个不接近结果的递归。因此,remove at
将永远旋转,将ingx
附加到它自己的cdr
(除非(car x)
一开始恰好与相等?
到(x y处的元素)
)
我想这是一个家庭作业,所以我只指出了你的错误,把纠正它们作为练习。如果不是这样,请告诉我,这样我们就可以查看一个工作版本。这很有效
(define (element-at lis k)
( if(null? lis)
(if(> k 0) #f '())
( let( (head (car lis))(tail (cdr lis)) )
(if(< k 2) head (element-at tail (- k 1 )))) ) )
(define (remove-at x y)
(let ((first (element-at x y))
(tail x))
(if (equal? (car x) first)
(cdr tail)
(cons (car x) (remove-at (cdr tail) (- y 1))))))
(删除-at2(列表“a”b“c”d)5)重新运行错误。
(remove-at2(列表“a”b“c”d)3)返回(a b d)这是有效的
(define (element-at lis k)
( if(null? lis)
(if(> k 0) #f '())
( let( (head (car lis))(tail (cdr lis)) )
(if(< k 2) head (element-at tail (- k 1 )))) ) )
(define (remove-at x y)
(let ((first (element-at x y))
(tail x))
(if (equal? (car x) first)
(cdr tail)
(cons (car x) (remove-at (cdr tail) (- y 1))))))
(删除-at2(列表“a”b“c”d)5)重新运行错误。
(删除-at2(列出“a”b“c”d)3)返回(a b d)请。另外,请学习使用ret
键。请。另外,请学习使用ret
键。