方案谐波函数

时间:2013-09-09 21:09:11

标签: scheme sum series

有没有办法用if语句而不是cond编写这个函数?以下按预期工作,但我很想看到另一种选择。

(define (harmonic-numbers n)
    (cond ((= n 1) 1)
       ((> n 1) (+ (/ 1 n)
       (harmonic-numbers(- n 1))))))

2 个答案:

答案 0 :(得分:2)

当然,cond可以实现为一系列嵌套if。请注意,您的代码中存在潜在错误,如果n小于1会发生什么?

(define (harmonic-numbers n)
  (if (= n 1)
      1
      (if (> n 1)
          (+ (/ 1 n) (harmonic-numbers (- n 1)))
          (error 'undefined))))

根据使用的Scheme解释器,if表单可能要求您始终为所有条件提供“else”部分(这就是为什么我n小于{时发出错误信号的原因{1}})。其他口译员不那么严格,并乐意让你写一个单臂条件:

1

修改

现在我们确定了如果(define (harmonic-numbers n) (if (= n 1) 1 (if (> n 1) (+ (/ 1 n) (harmonic-numbers (- n 1)))))) 小于1时会发生什么,我们可以使用n编写更简单的版本:

if

这是使用(define (harmonic-numbers n) (if (<= n 1) 1 (+ (/ 1 n) (harmonic-numbers (- n 1))))) 的等效版本:

cond

答案 1 :(得分:0)

cond在R6RS规范中称为Derived conditional,并不是必需的语法,如if。它不是原始的,但可以定义为宏。以下是R5RS规范中定义的cond的定义,但它与defined with syntax-case macros的当前版本兼容:

(define-syntax cond
  (syntax-rules (else =>)
    ((cond (else result1 result2 ...))
     (begin result1 result2 ...))
    ((cond (test => result))
     (let ((temp test))
       (if temp (result temp))))
    ((cond (test => result) clause1 clause2 ...)
     (let ((temp test))
       (if temp
           (result temp)
           (cond clause1 clause2 ...))))
    ((cond (test)) test)
    ((cond (test) clause1 clause2 ...)
     (let ((temp test))
       (if temp
           temp
           (cond clause1 clause2 ...))))
    ((cond (test result1 result2 ...))
     (if test (begin result1 result2 ...)))
    ((cond (test result1 result2 ...)
           clause1 clause2 ...)
     (if test
         (begin result1 result2 ...)
         (cond clause1 clause2 ...)))))