方案语法帮助:使用我在另一个程序中定义的函数

Posted

技术标签:

【中文标题】方案语法帮助:使用我在另一个程序中定义的函数【英文标题】:Scheme Syntax Help: Using a function that I have defined in another program 【发布时间】:2011-06-30 15:59:14 【问题描述】:

我创建了两个函数来帮助我解决我的Subset sum problem。不过,我似乎遇到了错误。它告诉我我将两个参数传递给list-sum。我已经在这个程序上玩了几个小时了。我想知道是否有人能发现问题。

这是我的list-sum

(define list-sum 
  (lambda(lst)
    (cond
      ((null? lst) 0)
      ((pair? (car lst))
       (+(list-sum (car lst)) (list-sum (cdr lst))))
      (else
       (+ (car lst) (list-sum (cdr lst)))))))

这是我使用list-sum的函数:

(define ssum
  (lambda (n l)
    (cond
      ((null? l) #f)
      ((=(-(- n (car l))(list-sum l)) 0) l)
      ((ssum (cons (car l)) (cdr (cdr l))))
      (else (ssum n (cdr l))))))

它告诉我,我用一个参数调用了“compound-procedure #(number) ssum”,并且它需要两个参数。我将其传递为(ssum 8 (list 1 3 5 7))

我的问题是:

    我的功能设置是否正确? 有没有更简单的求和方法 我的ssum 中的列表编号? 我对 Scheme 也很陌生。如果你看到 一种明显的缩短代码的方法, 请随时纠正我。

【问题讨论】:

您确实只使用一个参数调用它,即(cons (car l) (cdr(cdr l))) 回答问题胜于编辑代码。我试图弄清楚程序出了什么问题,后来看到了你的评论。 谢谢大家。在这么简单的修复之后我觉得有点傻。递归正在伤害我的大脑(哈哈)。不过,感谢您的宝贵时间。 【参考方案1】:

list-sum 函数可以优化。首先可以连接两个(list-sum (cdr lst)) 表达式,也可以将三个(car lst) 表达式简化为一个:

(define (list-sum lst)
  (if (null? lst)
      0
      (+ (let ((l (car lst)))
           (if (pair? l)
               (list-sum l)
               l))
         (list-sum (cdr lst)))))

【讨论】:

这算不上优化,它既不会改变函数的速度,也不会改变函数的空间使用...而且,每次使用首字母变量时,上帝都会杀死一只小猫。【参考方案2】:

我强烈建议您尝试racket,它的 IDE 有这个很棒的调试器,只有 ODB 可以声称更好。

我没有深入研究您的代码应该如何工作,因为在 ((ssum (cons (car l)) (cdr (cdr l)))) 行中实际上有几个错误:您调用 cons 时只有一个参数,但您也只有一种形式这个cond 子句,而它应该有一个测试和至少一个表达式。

【讨论】:

以上是关于方案语法帮助:使用我在另一个程序中定义的函数的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的语法错误:在严格模式代码中,函数只能在顶层或立即在另一个函数中声明

Java在另一个[重复]中调用构造函数

使用带有引用的对象向量的 C++ 语法

函数:语法 定义 参数 返回值

C++ 向量初始化:使用这种语法到底发生了啥? [关闭]

函数中的语法类型名称(类型)