2017-11-02 13 views
1

私はスキームやcar、cdrなどのアイデアに新しいがあります。リストの最後の要素を返すこの関数がありますが、今は空のリストを返します。スキームリストの最後の要素を取得する

(define (last mylist) 
     (if (list? mylist) 
       (if (null? mylist) 
        (if (null? (cdr mylist)) 
         '() 
         (last (cdr mylist)) 
        ) 
      )   
    ) 
) 
+0

私はそれを修正しました。何も得られません。 –

+0

最も内側の 'if'式で'(null?(cdr mylist)) 'が真であれば、空のリストではなく'(car mylist) () 'を返します。 – PieOhPah

答えて

1

(null? mylist)が保持されていない場合、それはなんですか?空でないリスト。

空でないリストには、1つ以上の要素が含まれる場合があります。

最後の要素が最初の要素であるリストの要素数はいくつですか?

このようなリストについては、「cdr」と言いますか?これを使用して、事前に再帰を停止する必要があります。今はリストが空になるまで続きますが、それより前に停止する必要があります。 {1}

(define (last mylist) 
     (if (list? mylist) 
       (if (null? mylist) 
        '() 
        ;; {1} 
        (last (cdr mylist)) 
        ;; 
       ))) 

あなたは無条件(last (cdr mylist))を呼び出します。しかし、あなたのリストの終わりに達したらどうしますか?要素が1つだけ残っている場合はどうなりますか?その場合はを返す必要があります。したがって、これを達成するには、無条件コードをif式に置き換えます。

+0

私はなぜ空リストを取得しているのか理解していますが、それを修正する方法がわかりません。我々は作業する言語の非常に小さなサブセットを与えられました。 –

+0

これはリスト –

+0

の最初の唯一の要素を返します。それがあなたの答えです。最後の要素です。例を書いてください:与えられた '(3 2 1)'、 '(null?lst)'は何を返しますか? '(cdr lst)'は何を返しますか?私たちはその結果を進めたいですか? '(2 1)'と同じです。 '(1)'のために。それはあなたに結果を与えるでしょう。 –

2

書籍How To Design Programsは、特定の詳細なデザインレシピを提供することでこの問題に答えるのに役立ちます。この特定の問題は、9.2項「空でないリスト」で説明しています。大まかに言えば、ここにあなたが従う必要がある手順です。

  • は非空のリストのためのデータ定義を策定(または本からそれを取る)
  • は、目的の声明、署名、およびあなたの機能
  • のヘッダーを書きます
  • WRITEのテストケース(テストケースがここたくさんを手助けしようとしている。(あなたのデータ定義によって許可されていない入力をテストする必要がないことに注意してください)
  • に関連付けられているテンプレートを追加あなたのデータ定義(書籍にも現れる)
  • テンプレート内の空白の部分を入力して、定義を完成させてください。
  • debug。だけで、あなたのインデントによって
2

、それはあなたが他のプログラミング言語

からのスキームに来ているしかし、あなたはまた、誤っifを使用していることは非常に明白だ - スキームでは、あなたはシングルブランチを持つことができませんif声明。まあ、唯一表現、およびif式は常に後件(3つのオペランド(引数)

  1. 述語(条件)
  2. がかかります、全くスキームにはありませんどのような述語が真の場合に起こる)
  3. 代替(述語が偽である場合)

あなたのプログラムは近くにあります。ちょっとした調整と、あなたが必要とするところであなたは正しいです - インデントがどのようにして容易にifの3つのオペランドを見るかを書き留めてください。

(define (last mylist) 
    (if (null? mylist) 
     #f 
     (if (null? (cdr mylist)) 
      (car mylist) 
      (last (cdr mylist))))) 

条件この答えの範囲を超えて

(define (last mylist) 
    (cond ((null? mylist) 
     #f) 
     ((null? (cdr mylist)) 
     (car mylist)) 
     (else 
     (last (cdr mylist))))) 

(last '()) 
;; #f 

(last '(1)) 
;; 1 

(last '(1 2)) 
;; 2 

(last '(1 2 3)) 
;; 3 

のシーケンスのネスト不要なコードを防ぐことができます最後に、Schemeはcondを提供していますが、(last '())の戻り値#fである - 私は上のlastを呼び出すことを主張するだろう空リストは、空のリストでcarを呼び出すのと同じ効果があります。しかし、私はそれをあなたに任せます。

0

私はこれがあなたの最初のコードに最も近いと思う:

(define (last mylist) 
    (if (list? mylist) 
     (if (null? mylist) 
      '() ; input list is empty 
      (if (null? (cdr mylist)) 
       (car mylist) ; list only has one remaining element so this is it 
       (last (cdr mylist)))) ; otherwise, recurse 
     #f)) ; input is not a list 

ifを使用して、必ず記入してください両方支店。

1

(null? (cdr mylist))という質問をしたとき、'()の代わりに(car mylist)が返されているはずです。その時点では、mylistが単一原子リストであることを意味します。

(define (last mylist) 
    (cond ((null? mylist) '()) 
     ((null? (cdr mylist)) (car mylist)) 
     (else (last (cdr mylist))))) 

あなたが条件のための唯一の2つのオプションがある場合ifが頻繁に使用されている間condは多くの武器を扱うので、あなたは、ネストされた条件を回避するためにcondの代わりifを使用することができます。

この本the Little Schemerは、Schemeプログラムで何が起こっているのかを視覚化するのに最も役立ちました。

関連する問題