Recursion 通过参数的方案递归

Recursion 通过参数的方案递归,recursion,scheme,Recursion,Scheme,我是全新的计划,这是一个家庭作业问题,所以请不要直接回答 我的问题是: 编写一个递归过程(任意?arg1 arg2…),其中argi 布尔值。任何如果其任何参数为#t,则返回#t,并且#f 否则 这些是制约因素: 您不能使用内置的程序映射、应用、列表->向量或 矢量->任何过程中的列表。同样,不要使用let表达式 或任何过程中的内部定义表达式,除非 但事实并非如此 这是我的代码::: (define any? (lambda args (if (null? args)

我是全新的计划,这是一个家庭作业问题,所以请不要直接回答

我的问题是:

编写一个递归过程(任意?arg1 arg2…),其中argi 布尔值。任何如果其任何参数为#t,则返回#t,并且#f 否则

这些是制约因素:

您不能使用内置的程序映射、应用、列表->向量或 矢量->任何过程中的列表。同样,不要使用let表达式 或任何过程中的内部定义表达式,除非 但事实并非如此

这是我的代码:::

(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