Схема, рекурсия с постоянным значением

Я ранее спрашивал о letrec и хвостовой рекурсии, я лучше понял letrec и хвостовую рекурсию из ответов, моя конечная цель заключается в том, чтобы реализовать код схемы для уравнения: например, y (i) = x (i) + 2, где x (i), y (i) - списки, поэтому они будут хвостовой рекурсией с i. теперь x, y, i будут в хвостовой рекурсивной подпрограмме, поэтому для этой части код будет: но 5 всегда будет одинаковым (не рекурсивным), но вы можете выбрать это постоянное число в качестве входного параметра, скажем, «константа»

поэтому ожидаемый результат, например когда вы попробуете это: (equalFunc 0 3 1 (lambda (x) x) 5)

это должно работать так ... ((0 1 2) (0 + 5 1 + 5 2 + 5))

окончательный ожидаемый результат: ((0 1 2) (5 6 7))

потому что он вычислит уравнение y (i) = x (i) + 5 (с границей i от 0 до 2 - так что x (i), y (i) должны быть рекурсией), но не «+ 5». Я просто не мог подумать, что делать с «+5» в подпрограмме рекурсии хвоста функции.

Я думаю, что такой код ... но да, он не работает ...

(define equationFunc
 (lambda (start end res func constant)
  (letrec (helper
         (lambda (x i y constant)
           (if (>= i start)
               (helper (cons i (+ x constant))
                       (- i res)
                       (cons (func i) y)
                       0)
               (cons x (cons y '()))
            )              
          )
         )
   (helper '() end '() 0)          
  )))

кто-нибудь может дать совет?


person user1915570    schedule 25.05.2014    source источник
comment
Вопрос совсем не ясный. Что func должен делать? Какова цель a и z в equationFunc? потому что вы не используете их во вспомогательной процедуре. И если я вызову функцию с такими параметрами: (equationFunc 0 3 1 identity 5) какой результат вы ожидаете?   -  person Óscar López    schedule 25.05.2014
comment
И под выводом я имею в виду: что будет напечатано интерпретатором после оценки процедуры, не пытайтесь словами объяснить результат, напишите точно ожидаемый результат, как бы он был напечатан на экране .   -  person Óscar López    schedule 25.05.2014
comment
Я отредактировал вопрос, надеюсь, будет более понятно, что я пытаюсь сделать   -  person user1915570    schedule 25.05.2014


Ответы (1)


Не ясно, как должно быть построено "уравнение". Мое лучшее предположение:

(define equationFunc
  (lambda (start end res func constant)
    (letrec ((helper
              (lambda (x i y)
                (if (>= i start)
                    (helper (cons i x)
                            (- i res)
                            (cons (+ (func i) constant) y))
                    (list x y)))))
      (helper '() (- end 1) '()))))

Обратите внимание, что нам не нужно было передавать start, end, res, func и constant в качестве параметров для процедуры helper, нам нужно передать только значения, которые продолжают изменяться на каждой итерации, а именно: x, y и i. Это работает для образца ввода / вывода, показанного в вопросе:

(equationFunc 0 3 1 (lambda (x) x) 5)
=> '((0 1 2) (5 6 7))
person Óscar López    schedule 25.05.2014
comment
@ user1915570 Если этот ответ был полезен, не забудьте принять щелкнув по галочке слева от него;) - person Óscar López; 25.05.2014