나는리스트의 홀수를 파괴적으로 증가시키는 절차를 만들고 싶었다. 나는 그것을 통해 재귀하고 그냥 'set-car!'를 사용한다고 생각했습니다. '이상한'때마다 사실이었다.
다음은 코드입니다.
(define (test lst)
(cond ((null? lst) lst)
((odd? (car lst)) (set-car! lst (+ (car lst) 1))
(test (cdr lst)))
(else (test (cdr lst)))))
왜 작동하지 않는지 모르겠지만 세트 카를 이해하지 못하는 것 같아요! 그리고 set-cdr! 누군가 설명 할 수 있습니까? 감사합니다.
인터프리터 나 프로 시저를 정의하는 언어 또는 호출 방식에 문제가있을 수 있습니다. 예를 들어 DrRacket에서는 다음과 같이 잘 작동합니다.
#lang r5rs
(define (test lst)
(cond ((null? lst) lst) ; this is the '() returned by the recursion
((odd? (car lst)) (set-car! lst (+ (car lst) 1))
(test (cdr lst)))
(else (test (cdr lst)))))
당신의 프로시 저는 빈 list 를 반환 할 것이라는 점을 명심하십시오. 이것이 재귀의 기본 케이스이고 이것은 최종 결과로 기본 케이스의 값을 리턴하는 tail-recursive 프로 시저이기 때문입니다. 그러나 걱정하지 마십시오. 입력 목록이 제자리에서 수정되었으므로 프로 시저가 값을 반환 한 후에 확인할 수 있습니다.
(define lst (list 1 2 3 4))
(display (test lst))
=> ()
(display lst)
=> (2 2 4 4)
가변성이 얼마나 혼란 스럽습니까? 프로 시저가 하나의 값을 리턴하지만 입력이 수정되어 현재 다른 값을 갖습니다. 이것이 (불변 데이터를 선호하는) 함수형 프로그래밍이 더 명확하고 이해하기 쉬운 이유 중 하나이며, 프로 시저 내에서 입력 매개 변수를 변경하는 것이 왜 나쁜 생각인지 보여줍니다.)
프로 시저 가 변경된 목록을 반환하기를 절대적으로 원한다면 @ sepp2k가 제안한대로 수행하십시오. 그러나 입력 목록 이 수정되었으며 실제로 결과로 반환되는 것과 동일한 목록임을 기억하십시오 .
(define (test lst)
(cond ((null? lst) lst)
((odd? (car lst)) (set-car! lst (+ (car lst) 1))
(test (cdr lst))
lst) ; add this line
(else (test (cdr lst)))))
직접 확인 :
(define lst (list 1 2 3 4))
(display (test lst))
=> (2 2 4 4)
(display lst)
=> (2 2 4 4)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다