【问题标题】:Recursive binary to decimal function without pow() or loops没有 pow() 或循环的递归二进制到十进制函数
【发布时间】:2009-11-30 17:56:24
【问题描述】:

我正在学习 C 课程。 我需要做一个递归异或二进制,但我有一些限制。 我不能使用循环或任何 math.h 函数,也不能从 XOR 函数调用另一个函数。

这是函数原型:

int binaryXor(int firstnumber[], int secondnumber[], int length);

其中 firstnumber 和 secondnumber 是长度相同的 1 和 0 的数组,length 是它们的长度。

该函数应该返回这两个数组的 XOR 的十进制值。 做异或很简单,但是我怎么能把它转换成十进制呢?

【问题讨论】:

  • 这个函数不返回任何“十进制值”,它返回一个整数。
  • 逻辑上是否可以处理数组的每个元素而不使进程成为循环?
  • 在课程作业的上下文中,我很确定如果你被告知要编写“递归函数”并且“不能使用循环”,那么递归call 不是循环。你可能同意也可能不同意循环的定义,但我很确定这里它意味着任何程序循环构造。

标签: c loops xor


【解决方案1】:

要编写没有循环的递归函数,您需要回答以下问题:

“我怎样才能用一个小问题来表达我的问题的答案?”

在这种情况下,问题在于您有length 数字要查看,但不允许您循环。那么,如何用较小的异或来表达大小为length 的异或,以及一些不需要循环的工作?

[编辑:等一下,再看看你的问题,你说你已经对异或进行了排序,所以我猜你已经这样做了。在那种情况下,我上面的评论是你唯一需要知道的:你已经完成了。 C 中的int 不是十进制值,它只是一个值。您无需将任何内容转换为十进制即可将其存储或返回到 int

如果您有兴趣,我可以发布使用递归函数将 int 转换为十进制值的代码。一种简单的方法是通过与 10 的越来越大的幂进行比较,计算出需要多少位数的“向下”,然后在返回“向上”的路上从末尾开始打印数字。]

【讨论】:

    【解决方案2】:

    这是一个标准的递归问题。诀窍是要意识到一个由 1 和 0 组成的字符串后跟 1 或 0 的整数值是 2 * 字符串的整数值加上数字的值。

    所以你会想做类似的事情

    if( length <= 0) return 0;
    
    return 2 * binaryXOR(firstnumber, secondnumber, length - 1) + (firstnumber[length - 1] ^ secondnumber[length - 1]);
    

    【讨论】:

    • '+'和'^'的相对优先级是多少?那么为什么你的表情会给出错误的答案呢?混合算术运算和按位运算时使用方括号(圆括号)!
    • 谢谢乔纳森。我通常不测试这些作业答案。 OP 可以从我的错误中吸取教训!
    • 非常感谢,你帮了我很多。
    【解决方案3】:

    可以使用递归函数调用来代替循环。

    【讨论】:

    • 是的 - 我讨厌这类硬件问题。谁会使用递归来遍历数组?
    • 在 C 中,没有人。在函数式语言中,每个人。所以可以说是的,学校应该用功能语言或更自然的例子来教授递归。但是不能简单地归结为循环的递归不是尾递归的,不能尾递归的问题在引入递归的早期阶段可能有点超出课程的水平。至少,我认为这是导致这些“做一些你从未真正做过的事情,只是为了说明一点”作业的想法。
    猜你喜欢
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    相关资源
    最近更新 更多