Scheme 返回列表并检查方案中的条件

Scheme 返回列表并检查方案中的条件,scheme,racket,Scheme,Racket,我有一个计算平方和的数字和的函数 和停止功能,检查数字序列的总和是否始终达到停止编号之一。{0 1 4 16 20 37 42 58 89 145} 如何创建一个名为“s_series”的函数,该函数返回一个包含数字和的列表,直到到达停止编号为止 ex :- (s_series 130) (10 1) 我的代码 (define (s_series x) (let ((number (sum-of-digits x))) (if (number stop(number) 1)

我有一个计算平方和的数字和的函数 和停止功能,检查数字序列的总和是否始终达到停止编号之一。{0 1 4 16 20 37 42 58 89 145}

如何创建一个名为“s_series”的函数,该函数返回一个包含数字和的列表,直到到达停止编号为止

ex :- (s_series 130)
 (10 1)
我的代码

    (define (s_series x)
    (let ((number (sum-of-digits x)))
(if (number stop(number) 1)
     ((let (L '(sum)))
      (s_series sum ))
      L
     ))

如何解决此问题并使其正常工作?

首先,如果您正在收集
平方数字之和
,则
停止?
函数应获取此和,而不是直接计算:

(定义(停止?值)
(如果(memv值)(01 4 16 20 37 42 58 89 145))35;t#f)
请注意,我使用了
memv
,因为我们知道我们在比较数字,
memv
使用
eqv?
进行比较,因此是作业的正确“成员”函数。此外,我不会在这里使用
平方和
来不对每个元素执行两次操作

在SRFI-1列表库中,有一个名为“展开”的函数:

(需要srfi/1);在#!R6R您导入(srfi:1),但我假设#lang racket
(定义(s系列开始)
(展开停止?;如果总和即将停止,则停止?
值;无术语转换
平方和;如何生成下一个值
(开始的平方和);忽略第一个值
(lambda(v)(列表五)),;保持停止值
(s系列120)
; ==> (5 25 29 85 89)

当然,推荐的方法是使用现有程序(如
展开
)来解决您的问题。这是函数式编程鼓励的思维方式。为了完整起见,让我们看看如何仅使用基本操作和我们定义的过程编写等效解决方案:

它按预期工作:

(s_series 120)
=> '(5 25 29 85 89)

这是你问题的后续行动。发布你自己的代码和你遇到的具体问题,否则人们会认为你只是想免费完成作业……你的代码中有很多语法错误。例如,您有一个
(if test)
表达式,没有
,然后是
else
表达式。由于括号过多,因此将多个值作为函数调用。例如,
((let…)
意味着
(let…
需要返回一个函数,因为调用ti时没有参数,
(sum)
正在调用没有参数的函数
sum
。因此,
(sosd x)
需要返回一个函数才能工作<代码>'(sum)
是带有符号的列表。它与变量
sum
(这可能是一个函数)无关。有没有办法不用展开函数来实现这一点?@user7630822是的,但是为什么不使用可用的工具呢?
unfold
的实现为您执行递归。
(s_series 120)
=> '(5 25 29 85 89)