パスワードを忘れた? アカウント作成
452752 journal

cooperの日記: pos+ 7

日記 by cooper
LISP Scheme スレでの話題。

(pos+ '(1 3 5 7)) ==> (1 4 7 10) というような、リストを受け取って、各要素に位置を足したリストを返す関数を定義するというもの。末尾再帰でやってみる。

#!/usr/bin/env gosh

(define (pos+ lst)
  (let loop ((r lst)
             (count 0))
    (if (null? r)
        '()
        (cons (+ (car r) count)
              (loop (cdr r) (+ count 1))))))

(define (main args)
  (display (pos+ '(1 3 5 7)))
  (newline))

あれれ、こうすると、末尾再帰にならないのかな?
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by visha (779) on 2003年12月11日 23時48分 (#452863) 日記
    末尾再帰になってない気がします。こんな感じ?

    #!/usr/bin/env gosh

    (define (pos+ list)
      (reverse
       (let loop ((result '())
              (tmp list)
              (i 0))
         (if (null? tmp)
         result
         (loop (cons (+ i (car tmp)) result)
               (cdr tmp)
               (+ i 1)))
         )))

    (define (main args)
      (display (pos+ '(1 3 5 7)))
      (newline))
    • by cooper (4658) on 2003年12月12日 8時31分 (#452980) 日記
      やっぱりそうでしたか。ありがとうございます。reverse の位置はこっちでも良いのでしょうか?

      (define (pos+ list)
        (let loop ((result '())
                   (tmp list)
                   (i 0))
          (if (null? tmp)
              (reverse result)
              (loop (cons (+ i (car tmp)) result)
                    (cdr tmp)
                    (+ i 1)))
          )))
      --

      -- cooper

      親コメント
      • by visha (779) on 2003年12月12日 9時29分 (#453005) 日記

        よいです。そちらの方が見通しはいいですね。

        # ぱっとloopを作って「逆順じゃん」で頭にreverseを突っ込んだのがバレバレでしたね(笑)。

        親コメント
      • by visha (779) on 2003年12月12日 17時13分 (#453396) 日記
        せっかくなので、再帰を使わない版も

        #!/usr/bin/env gosh

        (define (pos+ list)
          (map
           (let ((offset 0))
             (lambda (arg)
               (set! offset (+ offset 1))
               (+ arg (- offset 1))))
           list))

        (define (main args)
          (display (pos+ '(1 3 5 7)))
          (newline))

        ;;; set!を使うなんてダサ過ぎ、と言われれば返す言葉もございません。
        親コメント
        • by visha (779) on 2003年12月12日 17時31分 (#453415) 日記
          もうちょっと整理しました。思いつきを書き込む前に10秒くらい考えろよという教訓です。_o_

          #!/usr/bin/env gosh

          (define (pos+ list)
            (let ((offset 0))
              (map
               (lambda (arg)
                 (let ((i offset))
               (set! offset (+ offset 1))
               (+ arg i)))
               list)))

          (define (main args)
            (display (pos+ '(1 3 5 7)))
            (newline))
          親コメント
typodupeerror

※ただしPHPを除く -- あるAdmin

読み込み中...