首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回方案中的列表和检查条件

返回方案中的列表和检查条件
EN

Stack Overflow用户
提问于 2017-03-22 19:49:11
回答 2查看 166关注 0票数 0

我有一个函数和数字,它计算平方位和和停止函数,它检查数字和数列是否总是达到一个停止数。{0 1 4 16 20 37 42 58 89 145}

如何使一个名为“s_series”的函数返回一个包含数字之和的列表,直到到达一个停止号为止。

代码语言:javascript
复制
ex :- (s_series 130)
 (10 1)

我的代码

代码语言:javascript
复制
    (define (s_series x)
    (let ((number (sum-of-digits x)))
(if (number stop(number) 1)
     ((let (L '(sum)))
      (s_series sum ))
      L
     ))

我怎样才能解决这个问题并让它发挥作用?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-23 02:54:04

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

代码语言:javascript
复制
(define (s_series n)
  (let ((sum (sum-of-digits n)))
    (if (stop? n)
        (list sum)
        (cons sum (s_series sum)))))

它如预期的那样运作:

代码语言:javascript
复制
(s_series 120)
=> '(5 25 29 85 89)
票数 0
EN

Stack Overflow用户

发布于 2017-03-22 21:05:36

首先,如果您正在收集sum-of-squared-digits,那么stop?函数应该接受这样的和,而不是直接计算它:

代码语言:javascript
复制
(define (stop? value)
  (if (memv value '(0 1 4 16 20 37 42 58 89 145)) #t #f))

注意,我使用memv,因为我们知道我们在比较数字,而memv使用eqv?进行比较,因此是作业的正确“成员”函数。此外,我在这里也不使用sum-of-squared-digits来不对每个元素执行两次操作。

在SRFI-1列表库中,有一个名为unfold的函数

代码语言:javascript
复制
(require srfi/1) ; In #!r6rs you import (srfi :1) but I assume #lang racket

(define (s-series start)
  (unfold stop?                         ; stop if the sum is accodring to stop?
          values                        ; no term transformation
          sum-of-squared-digits         ; how to make th enext value
          (sum-of-squared-digits start) ; omit the first value 
          (lambda (v) (list v))))       ; keep the stop value

(s-series 120)
; ==> (5 25 29 85 89)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42961353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档