在 Swift 中不使用 sqrt 进行生根

Rooting without using sqrt in Swift

我试图在不使用 sqrt() 方法的情况下进行生根 Swift 练习。

我的想法如下:

import Foundation


    func rooting(number:Int) -> Int {
    
            for i in 1...100 {
                if i * i == number {
                    var Root = i
                    break }
                
                return Root //here
            }
        return Root //here
    }
            
            print(rooting(number:9))

但是在我为您留下评论的那几行,我得到 Cannot find 'Root' in scope 错误。当我尝试在 运行 函数之前将 root 初始化为整数时,该函数要么使用我初始化 Root 变量的值,要么在我尝试将其初始化为可选整数或空数组时出现一些错误.

我这里的想法有什么问题吗?

好的,这是我对齐后的代码。

import Foundation

func rooting(number: Int) -> Int {
  for i in 1...100 {
    if i * i == number {
      var Root = i
      break
    }
    return Root
  }
  return Root
}

print(rooting(number: 9))

问题是您在尝试使用变量之前结束的范围内创建 Root 变量。本质上,Root 变量仅存在于以下段中:

import Foundation

func rooting(number: Int) -> Int {
  for i in 1...100 {
    if i * i == number {
      var Root = I //Root variable starts existing
      break
    } //Root variable no longer exists
    return Root
  }
  return Root
}

print(rooting(number: 9))

这是因为它 范围 if 语句。要解决这个 特定的 问题,您可以将代码更改为:

import Foundation

func rooting(number: Int) -> Int {
  for i in 1...100 {
    if i * i == number {
      return i
    }
  }
}

print(rooting(number: 9))

因为除了 return 之外,您没有对 Root 做任何事情。当然,这仍然行不通,因为你不能保证 return 任何东西(如果 number 是 8 怎么办?),而且你说函数总是 return 一个Int.


这是一个实现生根功能的简单示例:

import Foundation

func rooting(number: Int) -> Int? {
  guard number > 0 else { return nil }
  for i in 0...(number/2) {
    if i * i == number {
      return i
    }
  }
  return nil
}

print(rooting(number: 9))

如果数字有平方根,它将被return计算;否则,函数 returns nil.