2016-05-01 96 views
0

我發現一個問題,它說它應該使用遞歸來解決。問題是,給定一定數量時,應計算其中存在的8個數,但如果兩個8相鄰,則應計爲雙倍數。例如:遞歸計算數字的出現

48 should return 1 
    4881 should return 4 
    8818 should return 5 

我已經在計劃提出了以下方案:

(define (count n) 
    (if (= n 0) 
     0 
     (begin 
     (if (= (remainder n 100) 88) 
      2 
      (begin 
       (if (= (remainder n 10) 8) 
        1 
        0)) 
      ) 
     (+ (count (quotient n 10)))))) 

的問題是,每次我運行它返回0,我缺少什麼?我不想使用列表或設置!用於使用輔助變量。任何幫助?

+1

我不認爲你需要的'begin's .. – thebjorn

+0

..但你需要自己調用中間答案(某處你可能希望定義商..?) – thebjorn

回答

1

只要你找到一個匹配,你必須保持迭代,並且總和似乎不正確。此外,而不是嵌套if的IT更好地使用cond,像這樣:

(define (count n) 
    (cond ((= n 0) 0) 
     ((= (remainder n 100) 88) 
     (+ 4 (count (quotient n 100)))) 
     ((= (remainder n 10) 8) 
     (+ 1 (count (quotient n 10)))) 
     (else 
     (+ (count (quotient n 10)))))) 

它與你的例子:

(count 48) 
=> 1 
(count 4881) 
=> 4 
(count 8818) 
=> 5 
0

這將是更好的計算787-8的掃描在一個幫手,並保持當前的點擊次數和之前掃描的總計數。

(define (funny-eights n) 
    (define (aux n cur total) 
    (cond ((= (remainder n 10) 8) 
      (aux (quotient n 10) (+ cur 1) total)) 
      ((> cur 1) 
      (aux (quotient n 10) 0 (+ total (* 2 cur)))) 
      ((= cur 1) 
      (aux (quotient n 10) 0 (+ total cur))) 
      ((> n 0) 
      (aux (quotient n 10) 0 total)) 
      (else 
      total))) 
    (aux n 0 0)) 

(funny-eights 488838288) ; ==> 11 or 3*2 + 1 + 2*2