【问题标题】:Recursive function in Scheme only returning the first item in listScheme中的递归函数仅返回列表中的第一项
【发布时间】:2013-10-29 02:17:11
【问题描述】:

我的函数只返回第一个元素——我的基本情况。也许我的递归错了,也许我需要一些关于 lisp 函数的帮助。

该函数需要返回转换为十进制的二进制列表中所有元素的总和。我选择先将列表中的每个元素转换为十进制,然后在转换后添加其余元素。我有 2 个功能。第一个效果很好, convertToBinary :

(define (binaryToDecimal n)
   (cond [(zero? n) 0]
         [else (+ ( * 2 (binaryToDecimal (quotient n 10)))
                  (remainder n 10))]
         )) 

第二个不太好:

(define (addBinary binaryList)
   (cond [(null? (cdr '(binaryList))) (binaryToDecimal (car binaryList))]
    [else 
     (cons (+ (binaryToDecimal (car binaryList)) 
              (addBinary (cdr '(binaryList)))))]
    ))

如果我用这个来调用函数:

(addBinary '(1101 111 10 101))

然后我得到:13。这是 1101 的十进制转换(我列表中的第一个元素)。我认为显然问题出在我的其他情况下,但我没有看到问题并希望得到一些帮助。我四处搜索并阅读到使用“cons”将构造(可以这么说)列表中的元素以及应用的更改。不确定这是否正确。谢谢!

【问题讨论】:

    标签: recursion lisp scheme


    【解决方案1】:

    您的代码有几个(cdr '(binaryList)) 实例,这与您期望的不符。也许您打算改用(cdr binaryList)。无论如何,你的基本情况也有点时髦:我认为你的基本情况应该是空列表,在这种情况下让它返回 0:

    (define (addBinary binaryList)
      (cond ((null? binaryList) 0)
            (else
             (+ (binaryToDecimal (car binaryList))
                (addBinary (cdr binaryList))))))
    

    【讨论】:

    • 啊哈!那解决了它!谢谢一百万 - 我已经在墙上(不是字面意思)敲打了一个小时试图弄清楚。当它是如此愚蠢的时候它会杀了我;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多