Это вопрос домашнего задания
Функция принимает список в качестве параметра, который может содержать столько слоев, сколько подсписок, сколько необходимо. Например, '(a (1 b 3)) или' ((a 3 5) (b (3 1) 4)). Выходные данные имеют ту же структуру списка, что и входные (это означает, что поддерживаются подсписки), но основной частью каждого списка является сумма всех чисел в списке. И все другие нечисловые значения отбрасываются. В качестве примера вывода рассмотрим «((a 3 5) (b (3 1) 4)), вывод должен быть» (16 (8) (8 (4))). Кроме того, используйте только инструкции / операции базовой схемы, такие как + - * /, car, cdr, cons, append, null ?, number ?, if / else, cond и т. Д. Невозможно использовать вспомогательный метод strong >.
Пока это код, который у меня есть, который иногда частично выполняет свою работу. Но мне очень трудно понять, как получить сумму из подсписок, чтобы сложить в одном месте в машине самого крайнего списка.
(define partialsums*
(lambda (lis)
(cond
[(null? lis) '(0)]
[(list? (car lis)) (cons (partialsums* (car lis)) (if (not (null? (cdr lis))) (partialsums* (cdr lis)) '()))]
[(number? (car lis)) (cons (+ (car lis) (car (partialsums* (cdr lis)))) '())]
[else (cons (+ 0 (car (partialsums* (cdr lis)))) '())])))
Я уже потратил на это несколько часов, но не совсем понял, как правильно подойти к проблеме, вероятно, потому, что это моя первая неделя использования схемы :(. Любая помощь приветствуется.
Кроме того, я не могу использовать вспомогательный метод. Все нужно делать внутри одной функции в рекурсивном стиле. letrec
тоже не допускается.
let
базовый?lambda
? (ИМХО, требование писать код наиболее подробным и наименее удобным способом - не очень хорошее обучение, если сразу не следует обратное.) - person molbdnilo   schedule 30.01.2020