我有一个函数和数字,它计算平方位和和停止函数,它检查数字和数列是否总是达到一个停止数。{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
))我怎样才能解决这个问题并让它发挥作用?
发布于 2017-03-23 02:54:04
推荐的方法当然是使用现有的过程(如unfold)来解决您的问题。这是函数式编程所鼓励的思维方式。为了完整起见,让我们看看如何仅使用基本操作编写等效的解决方案,以及我们previously定义的过程:
(define (s_series n)
(let ((sum (sum-of-digits n)))
(if (stop? n)
(list sum)
(cons sum (s_series sum)))))它如预期的那样运作:
(s_series 120)
=> '(5 25 29 85 89)发布于 2017-03-22 21:05:36
首先,如果您正在收集sum-of-squared-digits,那么stop?函数应该接受这样的和,而不是直接计算它:
(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的函数
(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)https://stackoverflow.com/questions/42961353
复制相似问题