数字に 6 がいくつあるかを調べる再帰的な手順を作成する必要があります。たとえば、606 には 2 つの 6 があります。始めました。
(define num
(lambda (n)
(cond
((< n 0) (num (- n)))
((= n 0) 0)
((> n 6)
私は何も変換したくありません。それを 10 で割る方法はありますか?
1) スキームの整数除算には、商関数を使用します。(商 9 2) は 4 を返します。
2) スキームの整数剰余には、剰余関数を使用します。
あなたが述べたように、スキームは再帰に基づいています。再帰的な問題を解決するには、問題のより小さなインスタンスの観点から解決策を述べる必要があります。 N の部分の解。
N の再帰が最も簡単な部分は N/10 で、これは N の最後の桁を除くすべてです。次に、これを再帰的に解くには、(num (商 N 10)) の答えを知っていると仮定する必要があります。その値を X と呼びます。N と X がわかると、N が何桁であるかがわかりますか?
N の最後の桁が 6 の場合、解は X+1 です。それ以外の場合、解は X です。最後の桁が 6 であるかどうかをどのように判断できますか? 剰余関数を使用します。
(define (num N)
; check cases
(cond
; case 1) negative condition
((< N 0) (num (- N)))
; case 2) zero condition, the terminal case
((= N 0) 0)
; case 3) recursive case with a 6 as the last digit
((= (remainder N 10) 6) (+ X 1))
; case 4) recursive case without a 6 as the last digit
(#t X)
))
ここで、X を再帰的な仮定に置き換えるだけでよいため、たとえばケース 3 は次のようになります。
; case 3
((= (remainder N 10) 6) (+ (num (quotient N 10)) 1))
ケース 4 の X も変更すると、解決策が得られます。
ほぼ同じです。紹介させてくださいmodulo
。2 つの数値を受け取り、最初の数値を 2 番目の数値で割った余りを返します。を取る(modulo n 10)
と、 の最後の桁が返されn
ます。あなたが望むものの一般的なスキーム(ba-duh-duh-chiiing)は
(define num-6s
(lambda (n)
(cond
((< n 10)
; Base Case, if n = 6, then 1 else 0
((= (modulo n 10) 6)
; The last digit of n is 6
(else
; The last digit of n isn't 6
))))
もう 1 つの役立つヒントとして、(floor (/ n 10))
数字の最後の桁を削除します。これは、再帰する次の番号を取得する方法です。