По сути, у вас есть два курсора. i
, который начинается в начале и идет к следующему элементу, и для каждого из тех, у кого есть j
, начинается один рядом с i
и продолжается до конца.
Вот как сделать цикл:
(let name ((var 0) (var2 5))
(if (> var var2)
var
(name (+ (* 2 var) 1) (+ var2 1))))
Поскольку здесь речь идет о списках, а списки представляют собой цепочки cons
вместо индексов, вы просто используете привязки к индивидуальному cons
для итерации:
(define test '(1 2 3 4 5 6 7 8))
(let find-half ((hare test) (tortoise test))
(if (or (null? hare)
(null? (cdr hare)))
tortoise
(find-half (cddr hare) (cdr tortoise))))
Так как называется let
? Это рекурсивная функция. Вышеуказанное совпадает с:
(define test '(1 2 3 4 5 6 7 8))
(define (find-half hare tortoise)
(if (or (null? hare)
(null? (cdr hare)))
tortoise
(find-half (cddr hare) (cdr tortoise))))
(find-half test test)
Может быть проще написать решение C с рекурсией? Например.
int fori (int i) {
return i >= count - 1 ||
forj(i, i+1) && fori(i+1);
}
int forj (int i, int j) {
return j >= count ||
array[i] == array[j] && forj(i, j+1);
}
int result = fori(0);