2015-10-04 3 views
0

Мне удалось составить код схемы, чтобы добавить два списка в схему. say, list1 - '(стр. D) list 2' (p p p. D) Моя пользовательская функция добавления с использованием cdr & Концепция автомобиля, можно сделать (p p p p. D), как ожидается.Умножьте в схеме для списков минусов

Однако теперь я хочу умножить и & на основе числа p, у меня есть пользовательская функция, которая дает мне количество списков. скажем, для list1 -> 1 list2-> 3

Я также могу определить, является ли какой-либо один из двух списков пустым, поэтому я выводю 'd.

Но реальная проблема заключается в том, когда дело доходит до умножения. песни1 - '(стр д.) Песни2 -' (PPPPP д.) результат ожидается - (2 * 5 = 10 р-х), так «(. Pppppppppp г)

Я попытался с помощью в то время как контур, сделать в то время, добавить пользовательская функция, но я не могу понять, как это сделать. Может быть, некоторые рекомендации могут помочь мне :)

Я хочу создать пользовательскую функцию, так как я не хочу использовать набор! или что-то, что облегчает процесс, но хочет понять рекурсию, как это могло бы работать в этом случае :).

+0

Что такое 'd' и' z'? Обычно сумма двух списков - это стандартная процедура 'append', но она не может делать точечные списки, поскольку' (a. B) 'добавляется к' (a. B) 'is' (aa. B) 'по вашему мнению, но что о первых списках 'b' ?? Вы написали код, который вы говорите, но где он? Если вам нужна помощь, вам нужно проявить определенные усилия. – Sylwester

+0

Вы хотите внедрить числа перанов ... правильно? –

+0

Ваша логика хороша, но проблема кроется в деталях вашего кода, поэтому только с логикой и без кода нам сложно угадать, что вы делаете неправильно ... Почему бы вам не переписать его (это потребовалось бы не более 2 минут, если вы знаете логику, за которой следуете), чтобы мы могли проверить это? – HyperZ

ответ

0

Я добавляю это в качестве ответа, поскольку он, похоже, обращается к вашей исходной проблеме, пытаясь реализовать номера Peano с использованием списков cons в схеме.

Для этого начинается нулевое значение и функции для увеличения и уменьшения чисел.

;; We define our abstraction for zero 
(define zero 'D) 

;; Increment a number, i.e. get its successor 
(define (inc number) 
    (cons 'P number)) 

;; Decrement a number, i.e. get its predecessor 
(define (dec number) 
    (cdr number)) 

Это позволяет перемещать все (положительные) целые числа. После этих функций можно построить надстройку функцию рекурсивной природы, эксплуатируя:

a + 0 = a 
a + b = (a + 1) + (b - 1) 

Аналогично функция умножения может быть дописывать функции добавления, используя:

a * 0 = 0 
0 * b = 0 
a * 1 = a 
a * b = a + (a * (b - 1)) 

Это приводит к следующему, хотя крайне неэффективно код:

;; Adding two numbers is done by "shifting" from one to the other, one by one. 
;; a + b = (a + 1) + (b - 1) 
(define (add lhs rhs) 
    (if (eq? rhs zero) 
     lhs 
     (add (inc lhs) (dec rhs)))) 

;; Multiplying the dumb way: 
;; a * b = a + (a * (b - 1)) 
(define (mul lhs rhs) 
    (if (or (eq? rhs zero) (eq? lhs zero)) 
     zero 
     (if (eq? rhs (inc zero)) 
      lhs 
      (add lhs (mul lhs (dec rhs)))))) 

(Live example)

+0

Большое спасибо ... Я скоро отправлю решение ... Тем не менее, вопрос, который я опубликовал в своем предыдущем комментарии, кажется очень сложным по сравнению с числами peano, которые, как я чувствую, намного проще ... – user222040

+0

Этот вопрос связан с оригинальный вопрос? Что вы подразумеваете под кортежами? –

+0

См. Здесь: http://stackoverflow.com/a/32938978/1116364 –

Смежные вопросы