2016-01-22 8 views
0

Я решаю его по php, и он работает. Но я пытаюсь использовать схему, получаю ошибку «Прерывание !: максимальная глубина рекурсии». Я использую микрокод MIT/GNU Scheme 15.3 . Вот такой код.SICP Упражнение 1.17 Прерывание !: превышена максимальная глубина рекурсии

PHP

function cc($a,$b) 
{ 
    if($b==1){ 
     return $a; 
    }elseif($b%2!==0){ 
     return $a+cc($a,$b-1); 
    }else{ 
     return cc(double1($a),halve($b)); 
    } 
} 
function double1($i) 
{ 
    return 2*$i; 
} 
function halve($i) 
{ 
    return $i/2; 
} 

схема

(define (cc a b) 
    (cond ((= b 1) a)) 
    ((odd? b) (+ a (cc a (- b 1)))) 
    (else (cc (double a) (halve b))) 
) 
(define (double n) 
    (+ n n) 
) 
(define (halve n) 
    (/ n 2) 
) 

ответ

0

Ваша схема версия не совсем корректно. Это больше похоже на этой PHP версии:

function cc($a, $b){ 
    if ($b === 1) { return $a; } 

    call_user_func($b%2!==0, 
       $a + cc($a, $b-1)); 

    return else(cc(double1($a), halve($b))); 
} 

Возможно, это лучший вариант:

(define (cc a b) 
    (cond ((= b 1) a) 
     ((odd? b) (+ a (cc a (- b 1)))) 
     (else (cc (double a) (halve b))))) 

Обратите внимание на identation отражает ход ) от первой линии cond до самого последнего.