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处的元素)
的函数,它有两个参数:一个list
x
和一个number
k
。它返回列表的第K个元素

例如,表达式
(元素位于’(abcd)3)
返回
c
。 然后是一个名为
(在xy处删除)
的函数,它有两个参数:一个list
x
和一个number
k
。它从列表中删除第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
将永远旋转,
ing
x
附加到它自己的
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
将永远旋转,
ing
x
附加到它自己的
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
键。