2017-01-04 6 views
0

文字列 - 整数対のリスト+ prefixという名前の文字列を取得しようとしていますが、 "starts-with"という名前の関数を使用すると、begininngが一致するすべてのint接頭辞。 問題は、私は前進するためにリストを得ることはできません、それは冒頭に立ち往生してプログラムがクラッシュすることです。スキーム再帰関数リストオーバーライド

私は入力で動作
(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番目のペアに得れば(「B」2)予想通り、それは他の条件になりますが、その後、LSは取り戻します次の値( "aa" 33)に進むのではなく、1行を元の値に戻します(前の値)。 私は「スキームに新しいMと私はそれが起こる理由を取得いけない、それはイライラ

+1

まず、すべての構文エラーを取り除きます。 –

+0

どの構文エラー?ラケットのコンパイラは何も言及しませんでした。 – mooly

+0

まあ、構文エラーがあり、_syntax errors_があります。 '(list(+ 1 2))'と '(list + 1 2)'の2つの式を比較してください。コンパイラまたはインタプリタは、完全に合法的な表現であるため、第2のコンパイラまたはインタープリタは文句を言わないでしょう。あなたが望むものでもないことはほぼ確実です。 –

答えて

2
あなただけの私たちは以前に定義された starts-withプロシージャを呼び出す必要があり

(それはリストをcharに文字列を変換するの世話を聞かせて)、およびを修正

(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)))) 

それは、これらのサブリストのそれぞれから2番目の項目(CDR)を取得し、その後、最初の項目に接頭辞を持っているそれらのサブリストをフィルタリングし、最終的にすべての機能を追加適用しますそのうちの。