【问题标题】:Scheme: use function result as argument in same function方案:在同一个函数中使用函数结果作为参数
【发布时间】:2019-12-03 23:02:12
【问题描述】:

我想创建一个递归方案函数,将其结果用作自身的参数。所以基本上,我希望 get-successor 迭代多次,每次将 x 替换为 get-successor 上一次迭代的结果。被引用的函数子列表只是从 lst 中选择一个子列表。我已经坚持了几天了,所以任何帮助都非常感谢!

(define (get-successor lst x)
  (car (shuffle (cdr (sub-list lst x)))))

【问题讨论】:

  • 我不明白你真正想要什么。
  • 代码和问题没有任何意义,但是调用自身并使用结果是完全正常的。许多递归函数都可以做到这一点。它工作的一个要求是它有一个不递归的基本情况,并且递归调用比之前的调用更接近基本情况。例如。 (define (my-length lst) (if (null? lst) 0 (+ 1 (my-length (cdr lst)))) 有效,因为递归是在一个小一个元素的列表上完成的,并最终达到返回 0 的基本情况。它将返回列表的长度。用更多细节编辑您的问题或将其删除。

标签: recursion scheme racket


【解决方案1】:

请记住,要使递归函数真正递归,它需要……嗯,递归。这就是:它需要调用自己。此外,您需要一个基本情况,以便您的递归函数最终停止递归,否则您将耗尽内存。

我不完全理解您的要求,但我确实记得曾经递归地遍历列表,这可能会对您有所帮助:

#lang racket
(define in?
  (lambda (lst x)
    (if
     (empty? lst) #f ;If the list is empty, x is not in lst.
     (if (equal? (car lst) x) #t ;If the first element is x then x it's in lst.
         (in? (cdr lst) x) ; the first element is not x, check with the rest of the list recursively
     )
    )
)
)

这段代码有什么作用?它告诉你x 是否在lst 列表中。 对于这个例子,我使用尾递归,只分析列表的第一个(前/车)元素,如果它恰好与x 不同,那么我丢弃这个元素并继续列表的其余/cdr .

什么时候停止?当列表为空或我们找到x时。

什么时候列表是空的?当我们遍历列表的每个元素时。 (cdr 取出第一个元素并返回列表的其余部分)

希望您在使用 DrRacket 编程时玩得愉快,它是我最喜欢的语言。如果您还有疑问,请务必告诉我们!

回头见。

【讨论】:

  • 一系列嵌套的ifs,其中所有的答案都是布尔值,等效地并且最好写成一系列嵌套的or和/或and形式。此外,悬空的右括号不是 Lispy,没有任何明确的理由说明为什么它们应该在那里。
  • 这是我大约 7 年前学习的方式,我已经脱离了循环有一段时间了。谢谢你的信息,但你能举个例子吗?
  • (and (empty? lst) (or (equal? ...) (in? ...)))。 :)
  • 好的,但是这个练习会失败。有没有什么地方可以读到这种风格?
  • stackoverflow.com/tags/scheme/info。你所说的“失败”和“这个练习”是什么意思?它对您的代码的等效重写。
猜你喜欢
  • 2018-06-30
  • 2011-11-18
  • 1970-01-01
  • 2014-05-29
  • 2021-04-17
  • 1970-01-01
  • 2018-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多