Recursion 通过参数的方案递归
我是全新的计划,这是一个家庭作业问题,所以请不要直接回答 我的问题是: 编写一个递归过程(任意?arg1 arg2…),其中argi 布尔值。任何如果其任何参数为#t,则返回#t,并且#f 否则 这些是制约因素: 您不能使用内置的程序映射、应用、列表->向量或 矢量->任何过程中的列表。同样,不要使用let表达式 或任何过程中的内部定义表达式,除非 但事实并非如此 这是我的代码:::Recursion 通过参数的方案递归,recursion,scheme,Recursion,Scheme,我是全新的计划,这是一个家庭作业问题,所以请不要直接回答 我的问题是: 编写一个递归过程(任意?arg1 arg2…),其中argi 布尔值。任何如果其任何参数为#t,则返回#t,并且#f 否则 这些是制约因素: 您不能使用内置的程序映射、应用、列表->向量或 矢量->任何过程中的列表。同样,不要使用let表达式 或任何过程中的内部定义表达式,除非 但事实并非如此 这是我的代码::: (define any? (lambda args (if (null? args)
(define any?
(lambda args
(if (null? args)
#f
(if (equal? #t (car args))
#t
(any? (cdr args))))))
我的问题似乎是我在最后一行(any?(cdr args))上遇到了一个无限循环。我不知道为什么会这样。我的教授说有个提示是写什么?作为接口过程,并编写一个帮助程序来处理列表。我不知道这会有什么帮助
任何建议都将不胜感激
编辑:我添加了新代码。我仍然得到一个无限循环
(define any?
(lambda args
(any-helper args)))
(define any-helper
(lambda (list)
(if (null? list)
#f
(if (equal? #t (car list))
#t
(any? (cdr list))))))
我认为,通过在主函数中编写lambda参数,我将向助手函数传递一个列表。我不确定这是否真的发生了。我不知道如何确保我不会无限地在'()上递归 考虑函数应用程序
(any?#f)
所采取的步骤。这将导致对(any?'())
的递归调用。接下来,它检查这个调用中的参数列表,”(())
,是否为null?
(它不是,因为它是一个包含”(
)的列表)(equal#t'(())
也是false,因此它会不断递归,因为您使用相同数量的参数调用它,而不是在每次递归调用中减少输入的大小
嘿,这是我的第100个答案!当你有一个符号参数或一个虚线列表作为原型时,最后一个参数,在你的例子中,
args
,包含剩余的给定操作数
假设您计算(any?#f5 6)
,那么参数将是(#f5 6)
。因为第一个参数是#f
,您然后调用(any?)(56))
,而不是(any?56)
通常,您会创建一个命名的let
或一个本地过程来处理一个单参数列表,这样您的代码才能真正工作,但由于不允许这样做,您需要使用apply
来执行此操作
(apply any?(#f 5 6))
与(any?#f 5 6)
相同。您可以将apply
视为过程定义中的点列表/符号原型
PS:如果使用any helper
而不是any?
递归,那么使用any helper
进行更新将非常有效。谢谢!除了使用cdr,我不知道每次如何减少列表的大小。我猜我不应该每次都检查null。@AbigailB我更改了“减少参数列表的大小”“减少输入的大小”因为考虑到赋值的限制,减少参数列表的大小是不可能的。这就是为什么你的教授建议创建一个助手函数。我添加了更多的代码。我仍然不确定是什么问题。@AbigailB你是从任何助手
调用any?
而不是用直接递归>任何帮助程序
,因此每次都会在其参数列表中使用单个元素递归调用any?
。呜呜呜呜,我会因为忽略了这一点而感到愚蠢吗!感谢您的帮助:)我检查了您的解决方案!非常感谢。不幸的是,我也无法使用apply