Справка по синтаксису схемы: использование функции, определенной в другой программе - PullRequest
2 голосов
/ 20 февраля 2011

Я создал две функции, которые помогут мне решить мою проблему суммы подмножеств .Я, кажется, получаю ошибку, хотя.Это говорит мне, что я передаю два аргумента list-sum.Я дурачился с этой программой уже несколько часов.Мне было интересно, если кто-нибудь может обнаружить проблему.

Это мой list-sum:

(define list-sum 
  (lambda(lst)
    (cond
      ((null? lst) 0)
      ((pair? (car lst))
       (+(list-sum (car lst)) (list-sum (cdr lst))))
      (else
       (+ (car lst) (list-sum (cdr lst)))))))

Это моя функция, которая использует list-sum:

(define ssum
  (lambda (n l)
    (cond
      ((null? l) #f)
      ((=(-(- n (car l))(list-sum l)) 0) l)
      ((ssum (cons (car l)) (cdr (cdr l))))
      (else (ssum n (cdr l))))))

Это говорит мне, что я вызвал «составную процедуру # (число) ssum» с одним аргументом и что он требует двух аргументов.Я передаю это как (ssum 8 (list 1 3 5 7)).

Мои вопросы:

  1. Правильно ли я настроил свои функции?
  2. Есть ли более простой способ суммирования чисел в списке внутри моего ssum?
  3. Я тоже новичок в Схеме.Если вы видите очевидный способ сокращения кода, пожалуйста, не стесняйтесь исправлять меня.

Ответы [ 2 ]

0 голосов
/ 15 июля 2011

Я настоятельно рекомендую вам попробовать racket , в его IDE есть этот замечательный отладчик, который только ODB может заявить, что он лучше.

Я не слишком углубился в то, как должен работать ваш код, потому что на самом деле в строке ((ssum (cons (car l)) (cdr (cdr l)))) есть несколько ошибок: вы вызываете cons только с одним аргументом, но у вас также есть только одна форма в это cond предложение, тогда как оно должно иметь тест и хотя бы одно выражение позади.

0 голосов
/ 02 мая 2011

Функция списка сумм может быть оптимизирована.Сначала можно объединить два выражения (list-sum (cdr lst)) и можно уменьшить три выражения (car lst) до одного:

(define (list-sum lst)
  (if (null? lst)
      0
      (+ (let ((l (car lst)))
           (if (pair? l)
               (list-sum l)
               l))
         (list-sum (cdr lst)))))
...