0

リストを受け取り、リストの要素に基づいて適切な関数を適用する単純な再帰関数を作成しようとしています。入力時:

Input:  (myfunct '(plus ( minus(5 4) 3 ) )
Output: 4

そのため、文字列が何であるかを確認し、それに応じて式を再帰的に解決します。

これは私が今持っているものです(プラスだけ):

(define (myfunct lis)
    ((integer? (car lis)) (car lis))
    ((equal? 'plus (car lis)) (+ myfunct(car (cdr(lis)) myfunct(cdr(cdr lis)))))                                              
 )
 //if its an integer, return it
 //if its plus, call myfunct with the 2 next heads of the list

これにより、エラーが発生します (入力 "(myfunct '(plus 4 5))":

application: not a procedure;
 expected a procedure that can be applied to arguments
  given: #f
  arguments...:
   plus

エラーの理由を特定できません。説明/修正をお願いできますか?

編集:

(define (myfunct lis)
  (cond  ((integer? lis) lis)
         ((integer? (car lis)) (car lis))
         ((equal? 'plus (car lis))
          (+ (myfunct (car (cdr lis))) (myfunct (cdr (cdr lis)))))))

で動作します:(myfunct '(plus (plus 4 5) 6) ただし、それでも動作しません... (myfunct '(plus (plus 4 5) (plus 2 3))). 2 番目の引数は、void "()" として返され続けます。再帰ツリーを描画しましたが、そのエラーの理由がわかりません。何か案は?

EDIT 2: 最終的な有効な回答。なぜこれが機能し、他の機能が機能しないのか 100% 確実ではありません。その上の車は間違った値を返します。

(define (myfunct lis)
  (cond  ((integer? lis) lis)
          ;;((integer? (car lis)) (car lis))
         ((equal? 'plus (car lis))
          (+ (myfunct (car (cdr lis))) (myfunct (cdr (cdr lis)))))
         (else (myfunct (car lis)))))
4

1 に答える 1

2

括弧にいくつかの問題があります (欠落している、場所が間違っているなど)。IDE のツールを使用して、このようなエラーを検出します。特に、Racket はプロシージャを適用しようとしていると見なすため、本体の両方の行を囲む括弧が間違っています。これがapplication: not a procedureエラーが発生する理由です。

  ((integer? (car lis)) (car lis))
  ^                              ^
wrong                          wrong

それに加えて、さまざまなケースを区別するために条件( 、など) を使用する必要があります。また、各式の部分を正しく処理していません。リストの 1 番目、2 番目、3 番目の要素にアクセスする方法を見つけてください。ifcond

この演習に取り組む前に、まず構文に慣れ、より短く単純な手順を作成することをお勧めします。始めるためのヒントをいくつか紹介します。空欄を埋めてください。

(define (myfunct lis)
  (cond ((integer? lis)
         lis)
        ((equal? 'plus <first element>)
         (+ (myfunct <second element>) (myfunct <third element>)))
        (<similarly for the 'minus case>)

すべてが正しければ、提供したサンプル入力は期待どおりに機能するはずです。

(myfunct '(plus 4 5))
=> 9
(myfunct '(plus (minus 5 4) 3))
=> 4
于 2014-04-01T04:27:35.343 に答える