現在記述されているように、コードは1または0のみを返します。このプロシージャを意図したとおりに機能させるには、スキームに関する2つの重要なことを理解する必要があります。再帰呼び出しのしくみと割り当てのしくみです。
割り当て:
スキームで割り当ての非常に詳細な内訳を書きましたが、この場合の短いバージョンは、x
を呼び出すときにの値を変更しないということです(+ x 1)
。スキームのバインディングの値を実際に変更する場合は、set!
プロシージャを使用する必要があります(ただし、この場合は実際に変更する必要はありません)。
再帰:
再帰とは、プロシージャ自体の内部から呼び出す場合であることを思い出してください。再帰的解法には、null値と還元式の2つの必要な要素があります。
加算または減算の場合、null値は0です。乗算の場合は1です。cons
これは、空のリスト'()
です。
還元公式は、問題をより単純な部分に分解する方法、または各ステップで問題を解決に近づける方法です。
例:
(define count-elements
(lambda (lst)
(if (null? lst) 0 ; <-- I'm done? return the null value
(+ 1 (count-elements (cdr lst)))))) ;<-- otherwise +1 and reduce the problem
これは宿題なので、明示的に解決することはしませんが、答えは基本的にcount-elementsと同じ形式である必要があります。実際に何かを追加する必要があるかどうかを判断するには、別の述語が必要です。