0

私は(理論的には)再帰を使用しなければならない単純なメソッドをSchemeに持っています。問題は、再帰部分を理解できないように見えることです...「ポインター」と任意の多くの引数を取るプロシージャがあり、引数を1つずつ別のメソッドに渡す必要があります。これが私がこれまでに得たものです:

(define (push-elements ptr . args)
    (define (push-all ptr list)
        (if (null? list)
            '()
            (ptr 'push-elements (car list))))
     (push-all ptr list))

ここに再帰がないことはわかっていますが、どこに再帰を配置するか/どのように実行するかがわかりません。考えは明らかです。'push-all' 内で呼び出す必要があります。

(push-all ptr (cdr list))

誰かが私を助けることができれば (そして、このような再帰的な方法を作成する方法についての説明に非常に感謝します)、それは素晴らしいことです.

4

2 に答える 2

0

基本的に、副作用のfor-eachようなのバリアントを実装しています。map

(define (for-each procedure lst)
  (let loop ((lst lst))
    (if (null? lst)        
        'undefined-value
        (begin
          (procedure (car lst))
          (loop (cdr lst))))))

(for-each display (list 1 2 3 4)) ; prints 1234

しかし、値を引数として指定できるようにしたかったので、lst を残りの引数に変更する必要があります。

(define (for-each-arg procedure . lst) ; changed to dotted list / rest here
  (let loop ((lst lst))
    (if (null? lst)        
        'undefined-value
        (begin
          (procedure (car lst))
          (loop (cdr lst))))))

(for-each-arg display 1 2 3 4) ; prints 1234

より機能的なアプローチが必要な場合は、実際にマップまたは折り畳みを作成しています。おそらく、左折が好まれるでしょう:

(define (fold-args join init . lst)
  (let loop ((acc init) (lst lst))
    (if (null? lst)
        acc
        (loop (join (car lst) acc) (cdr lst)))))

(fold-args cons '() 1 2 3 4) ; ==> (4 3 2 1)

これで実際に実装できますfor-each-arg

(define (for-each-arg procedure . lst)
  (apply fold-args 
         (lambda (x acc) 
           (procedure x) 
           'undefined) 
         'undefined 
         lst))

(for-each-arg display 1 2 3 4) ; => undefined-value; prints 1234
于 2015-03-26T21:39:29.190 に答える