【问题标题】:C# ?: Ternary Operator - Unexpected symbol '?' - Error [closed]C# ?:三元运算符 - 意外符号“?” - 错误[关闭]
【发布时间】:2020-12-31 10:36:56
【问题描述】:

这是我尝试解决一个关于科拉茨猜想的小问题。 我收到错误 CS1525:意外符号 `?' 我不知道我对 ?: 运算符有什么误解。

public class Program
{
    int Step = -1;
    
    public static int collatz(int num)
    {
        Step++;
        (num%2 == 0) ? collatz(num/2) :
            (num%2 == 1) ? : return Step : collatz(num*3+1); 
    }
}

【问题讨论】:

  • 你使用车削的方式不对。你期望你的最终结果是什么?
  • 删除: return
  • (num%2 == 1) ? : return Step ? 和下一个 : 之间什么都没有
  • @Camilo 这不是唯一的问题。那行没有任何意义。
  • @41686d6564 是的,我知道,问题真的太多了

标签: c# recursion conditional-statements


【解决方案1】:

首先,? : 在这个表达式的中间:

(num%2 == 1) ? : 

三元组应该是<expr> ? <expr> : <expr>;
?: 之间不能没有表达式。


接下来,您不能在三元表达式的中间return

然后,你必须对表达式的结果做一些事情:你必须分配它、返回它、将它传递给一个函数等等。你不能有一个“什么都不做”的三元组。

根据您的代码,我认为您想返回整个表达式的值。

解决所有这些问题,你会得到:

public static int collatz(int num)
{
    Step++;
    return (num%2 == 0) ? collatz(num/2) :
           (num%2 == 1) ? Step : collatz(num*3+1); 
}

最后,解决了你算法中的问题,我得到了:

using System;

public class Program
{
    public static int Main()
    {
        Console.WriteLine(String.Format("Collatz Value {0}; Num Steps {1}\n", 12, collatz(12)));
        return 0;
    }
    
    public static int collatz(int num)
    {
        return (num == 1)? 0 : 1 + collatz( (num%2==0)? num/2 : num*3+1 );
    }
}

IDEOne Link

输出

Success #stdin #stdout 0.02s 16104KB
Collatz Value 12; Num Steps 9

【讨论】:

  • collatz(num*3+1) 什么时候执行?模 2 的数字返回 0 或 1(对于任何正整数)
  • intValue % 2 的结果不是 0 还是 1 吗? (num%2 == 1) 部分对我来说似乎是多余的(因此,? Step 也没有意义)。
  • @OlivierRogier 不,除非有人错误地实现了模数,否则 100%3 不是 3。 Mod n 不应该有超过 n 个可能的结果,至少对于正数(在我看来也不应该,但不是每个人都同意)
  • 是的,应该是num == 1 而不是num%2 == 1
  • 我只能修复这么多张贴者的代码。我发现了多个问题,并解决了所有问题。代码现在编译并运行。让它做正确的算法是另一个问题,发帖人的责任,不是我的。
猜你喜欢
  • 2022-01-11
  • 2011-09-10
  • 2015-02-15
  • 2017-03-05
  • 2023-03-09
  • 1970-01-01
  • 2012-04-03
  • 2011-12-31
  • 1970-01-01
相关资源
最近更新 更多