Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion scheme递归函数中的out模式参数_Recursion_Scheme_Parameter Passing - Fatal编程技术网

Recursion scheme递归函数中的out模式参数

Recursion scheme递归函数中的out模式参数,recursion,scheme,parameter-passing,Recursion,Scheme,Parameter Passing,读者注意:对函数式编程一无所知,对Scheme更是一无所知 我在Scheme中有一个递归函数。在非基本情况部分,函数自身调用两次,比较if语句中的两个调用。我需要返回更大的结果。所以我目前正在做的是: (if (> (recursive-call a b-1) (recursive-call a-1 b)) (recursive-call a b-1) (recursive-call a-1 b)) 这显然需要我进行3次递归调用,而不是2次 是否有方法从if语句引用递归调

读者注意:对函数式编程一无所知,对Scheme更是一无所知

我在Scheme中有一个递归函数。在非基本情况部分,函数自身调用两次,比较if语句中的两个调用。我需要返回更大的结果。所以我目前正在做的是:

(if (> (recursive-call a b-1) (recursive-call a-1 b))
    (recursive-call a b-1)
    (recursive-call a-1 b))
这显然需要我进行3次递归调用,而不是2次

是否有方法从if语句引用递归调用的值?我不允许定义其他函数或使用let。我认为这与输出模式参数有关,但不知道如何使用、分配或访问输出模式参数的值。当我问教授时,有人指出函数语言中的参数传递方法以及函数返回的一般过程。这一点帮助都没有。我不能发布完整的代码,因为这是一个类的作业。有没有可能有人能给我指出正确的方向

注意:我们只允许构造null?、car、cdr、else、lcm、+、>、if、递归函数的参数(必须是列表和数字)、整数文本和括号。不幸的是,没有使用max、define或let

注意:
b-1
a-1
是变量的名称。如果你想要减法,你可以使用
(-a1)
。我会在我的答案中使用
(-a1)
,但如果它真的是一个变量,你可以直接替换它

不受限制地执行此特定逻辑的明显方法是:

;; return the largest of the two
(max (recursive-call a (- b 1)) 
     (recursive-call (- a 1) b))
标准的方案方法是使用
let
绑定变量中多次使用的值,这样您就不会进行超出需要的计算:

;; cache computed values in local bindings
(let ((a (recursive-call a (- b 1)))
      (b (recursive-call (- a 1) b)))
  (if (> a b) a b))
由于您被限制不使用其中任何一个,因此可以将
let
版本重写为其原始形式。let可以这样重写:

(let ((ba va) (bb vb))
  ...)

; ===
((lambda (ba bb)
   ...)
 va
 vb)

我想您应该可以从这里找到答案。

使用内置的
max
过程,您可以执行
(max(递归调用a b-1)(递归调用a-1b))
,而不是使用if语句。或者,您可以定义其值将是递归调用的变量,然后您可以使用您已有的设置在if语句中比较这些变量:
(if(>ab)ab)
,其中a是第一个递归调用
(define a(recursive call a b-1))
,b是另一个。如果允许
lambda
,请记住
让((x e))b)
((lambda(x)b)e)
。同样,没有lambda,没有let。只有null?,car,cdr,else,lcm,+,>,if,递归函数的参数,整型文字和括号。请不要这样破坏你的帖子。删除的评论。@MichelleWilliamson没有
lambda
定义
你应该如何创建一个函数?它就像一个ru定义和lambda用于创建递归函数。我们不允许再次使用它们,也不允许修改给定的函数定义。我们只允许在cond中添加内容。允许在cond中添加内容只能包含constUCT给定。@MichelleWilliamson在这种情况下,冗余呼叫可以接受,或者您遇到XY问题,您选择的解决方案使您陷入困境,并且最初的问题可以在这些限制范围内轻松解决。也许如果我们知道您的实际问题并了解您目前的情况,我们可以向您指出不同的di回复。谢谢@Sylvester。不幸的是,我不能再发了。我已经觉得如果我再发帖子,教授可能会对我提出质疑。不过,我确实再次收到了教授的回复,我得到的解决方案是正确的。昨天他的回复让我陷入了一场白费力气的追逐,认为必须有一个更为优化的解决方案我只是没有语言方面的知识和经验。