Вам нужно отделить рекурсию от вычитания:
(define (parent-nodes-helper n)
(if (= n 0)
0
(* 2 (parent-nodes-helper (- n 1)))))
;;; Number of parent nodes in a perfect balanced binary tree
(define (parent-nodes depth)
(- (parent-nodes-helper depth) 1))
Сейчас.Помощник может быть сделан локальным для fnum
и даже может быть реализован с именем let
, а затем вы можете добавить параметр acc
для хранения результата, чтобы не нужно было умножать после окончания каждого отказов.Вот как я бы это сделал:
;;; Number of parent nodes in a perfect balanced binary tree
(define (parent-nodes depth)
(let loop ((n depth) (acc 1))
(if (zero? n)
(- acc 1)
(loop (- n 1) (* acc 2)))))
Обычно называют итеративную хвостовую рекурсию в именованном let loop
, но я мог бы оставить имя parent-nodes-helper
или любое другое, что мне показалось подходящим.Это просто имя.