3

私はSchemeでこの反復プロセスを持っています。(実際、それが実際にどのようなプロセスであるかはわかりません)

(define (contains-double? lst)
 (cond
  ((or (null? lst) (null? (cdr lst))) #f)
  ((eq? (car lst) (cadr lst)) #t)
  (else (contains-double? (cdr lst)))))

同じ番号が2つ並んでいるかどうかをチェックします。例えば:

(contains-double? '(1 2 3 3 3 5 2))    => #t
(contains-double? '(1 2 3 5 3 2))      => #f
(contains-double? '(1 2 3 2 2))        => #t

このプロセスを再帰的にすることはできますか?

前もって感謝します

4

1 に答える 1

2

問題のプロシージャは再帰的です(contains-double?それ自体を呼び出しています)が、プロシージャが末尾再帰スタイルで記述されているため、生成されるプロセスは反復的です。つまり、プロシージャが再帰呼び出しから戻った後は、returnを除いて何もする必要はありません。その値。

この手順で生成されたプロセスは、末尾再帰を削除することで再帰的にすることができます。

(define (contains-double? lst)
  (if (or (empty? lst) (empty? (rest lst)))
      #f
      (or (contains-double? (rest lst))
          (= (first lst) (second lst)))))
于 2012-11-10T16:30:23.183 に答える