2017-01-04 7 views
0

Я пытаюсь сделать рекурсивную функцию, которая получает список пар строк-строк + строку с префиксом и использует функцию с именем «начинается с», она суммирует все ints, чьи начальные совпадения префикс. Проблема в том, что я никогда не могу получить список, чтобы идти вперед, он застревает в начале, а затем сбой программы.переопределяет список рекурсивных функций

(define (sum-of-pairs-start-with prefix ls) 
    (let*( (prefix2 (string->list prefix)) 
      (str2 (string->list (car (car ls))))) 
(cond((null? str2) 0) 
    ((starts-with prefix (car(car ls))) 
     (+ cdr(car ls) (sum-of-pairs-start-with prefix (cdr ls)))) 
    (else sum-of-pairs-start-with prefix (cdr ls)))))  

Я работаю с входом:

(sum-of-pairs-start-with "a" (list (cons "a" 1) (cons "b" 2) (cons "aa" 33) (cons "ca" 4))) ;; =34 

, но как только я получаю на вторую пару в списке («Ъ» 2) он переходит в состояние еще, как и ожидалось, но затем Ls возвращается вверх по одной линии в начало (с предыдущим значением) вместо перехода к следующему значению («aa» 33). Я новичок в схеме, и я не понимаю, почему это происходит, это расстраивает

+1

Во-первых, избавиться от всех синтаксических ошибок. –

+0

какие синтаксические ошибки? Компилятор racket не упоминал никого .. – mooly

+0

Ну, есть синтаксические ошибки, и есть _syntax errors_. Сравните эти два выражения: '(list (+ 1 2))' и '(list + 1 2)'. Компилятор или интерпретатор не будут жаловаться на второй, потому что это совершенно законное выражение. Это также почти наверняка не то, что вы хотите. –

ответ

2

Вы просто должны вызвать starts-with процедуру, что мы ранее определенный (пусть заботиться о преобразовании строки в обугливается списки), и исправить все проблемы синтаксиса:

(define (sum-of-pairs-start-with prefix ls) 
    (cond ((null? ls) 0) 
     ((starts-with prefix (car (car ls))) 
     (+ (cdr (car ls)) (sum-of-pairs-start-with prefix (cdr ls)))) 
     (else (sum-of-pairs-start-with prefix (cdr ls))))) 

Еще раз, у вас возникли проблемы вызывающих процедур. Например, эти фрагменты являются неправильными:

cdr(car ls) 
(else sum-of-pairs-start-with prefix (cdr ls)) 

Пожалуйста, возьмите книгу по схеме и на практике основного синтаксиса, помните, что процедуры не называется так: f(x), правильный путь (f x). Кроме того, обратите внимание на правильный способ отступов кода, будет легче найти ошибки, если вы будете следовать соглашениям.

+0

Лопес поверьте мне, я делаю все возможное, смотрю его на youtube и прочее, но я просто не понимаю. И я уже решил это сам, но у меня все еще много вопросов – mooly

+1

@mooly Я знаю, что вы пытаетесь, и я рекомендую ваши усилия :-), но было бы неплохо потратить больше времени на ознакомление с основным синтаксисом и решение более простых проблем, прежде чем решать более сложные задачи. Некоторые хорошие книги для начала: «Маленькая схема», «Как создавать программы». –

+0

@mooly Оба [Как создавать программы] (http://htdp.org/) и [Структура и интерпретация компьютерных программ] (https://mitpress.mit.edu/sicp/) (не совсем как новичок , но очень хорошо), свободно доступны в Интернете. Книги лучше, чем youtube. – molbdnilo

0

Ниже приводится решение с использованием более высокие функции:

(define (sum-of-pairs-start-with prefix ls) 
    (apply + 
     (map cdr 
       (filter (λ (x) (starts-with prefix (car x))) 
         ls)))) 

Это отфильтровывает те подсписки, которые имеют префикс в первом пункте, затем получает второй пункт (CDR) из каждого из этих подсписков и, наконец, применяется добавить функцию ко всем из них.